2016-02-11 3 views
1

Можно ли выращивать и сжимать managed_ windows _shared_memory? Я пробую пример для managed_shared_memory от boost doc и это работа.boost interprocess managed_windows_shared_memory grow()

//Now that the segment is not mapped grow it adding extra 500 bytes 
managed_shared_memory::grow("MyManagedShm", 500); 

Но когда мой «MyManagedShm» - это Windows-родной серп, программа просто замерзает. Если я пишу

managed_windows_shared_memory::grow("MyManagedShm", 500); 

компилятор говорит

no matching function to call 

с примечанием

couldn't deduce template parameter 'ManagedMemory' 

и покажите мне кандидата, который идеально подходит:

template<class ManagedMemory> 
    static bool grow(const char *filename, std::size_t extra_bytes) 
    { 
     typedef typename ManagedMemory::device_type device_type; 
     //Increase file size 
     try{ 
     offset_t old_size; 
     { 
      device_type f(open_or_create, filename, read_write); 
      if(!f.get_size(old_size)) 
       return false; 
      f.truncate(old_size + extra_bytes); 
     } 
     ManagedMemory managed_memory(open_only, filename); 
     //Grow always works 
     managed_memory.self_t::grow(extra_bytes); 
     } 
     catch(...){ 
     return false; 
     } 
     return true; 
    } 

Я не могу найти любую информацию в ускорительных документах, что это не возможно в окнах. Может быть, в окнах мне нужно форсировать сегмент unmap, прежде чем расти или сокращаться? Я не могу найти, как это сделать.

Если я пишу

#include <boost/interprocess/managed_shared_memory.hpp> 
#include <boost/interprocess/managed_windows_shared_memory.hpp> 
using namespace boost::interprocess; 

int main() { 
    { managed_windows_shared_memory msm(open_or_create, "mmap", 400); } 
    //{ managed_shared_memory::grow("mmap", 65535);    } 
    { managed_windows_shared_memory msm(open_only, "mmap");   } 
} 

Это бросить "файл не найден" на второй открытый.

+0

, что делает «, когда это ж indows родной сегмент "даже означает? Это не должно быть * открытым * во время роста, очевидно – sehe

+0

Остановить попытку поиска обходных решений, он не должен «замораживаться». Если вы найдете обходной путь, то он снова замерзнет. Сначала отключите защиту от вредоносных программ. Затем используйте отладчик, включите сервер символов, покажите нам трассировку стека. –

+0

Я думаю, что он замораживается, потому что я вызываю grow() в том же {} -пространстве (я не знаю, как он звонит на английском языке), поэтому сегмент был сопоставлен. Если я сделаю это правильно - это исключение. Я думаю, из-за «windows_shared_memory не имеет стойкости ядра, и разделяемая память уничтожается, когда все процессы уничтожают все свои объекты windows_shared_memory и отображенные области для одной и той же разделяемой памяти или процессы завершают/сбой». И теперь я в замешательстве: у {} -пространства есть собственные процессы ?! – alebaster

ответ

0

Что означает «когда это родной сегмент Windows» означает даже? Это не должно быть во время роста, очевидно.

Кроме того, перегрузка «идеального соответствия» будет никогда вывести аргумент шаблона, потому что он не используется в подписи.

Таким образом, вы всегда должны явно создавать экземпляр.

Доказательство концепции:

Live On Coliru

#include <boost/interprocess/managed_mapped_file.hpp> 
using namespace boost::interprocess; 

int main() { 
    { managed_mapped_file mmf(open_or_create, "mmap", 400); } 
    { managed_mapped_file::grow("mmap", 65535);    } 
    { managed_mapped_file mmf(open_only, "mmap");   } 
} 

Live On Coliru

#include <boost/interprocess/managed_shared_memory.hpp> 
using namespace boost::interprocess; 

int main() { 
    { managed_shared_memory msm(open_or_create, "mmap", 400); } 
    { managed_shared_memory::grow("mmap", 65535);    } 
    { managed_shared_memory msm(open_only, "mmap");   } 
} 
+0

«когда это родной сегмент Windows» означает managed_windows_shared_memory, который отличается от портативного управляемого_shared_memory (используя файл подкачки, разницу в жизни). – alebaster

Смежные вопросы