Я пытаюсь разделить структуру между процессами, используя interprocess в Boost.boost interprocess managed_mapped_file find failing
Я определил отображаемый файл, чтобы использовать нулевой мьютекс, потому что у меня были проблемы с его блокировкой, и я не прочь сделать синхронизацию самостоятельно.
У меня возникают проблемы с поиском объектов.
У меня есть следующее заявление:
typedef boost::interprocess::basic_managed_mapped_file
< char,
boost::interprocess::rbtree_best_fit<boost::interprocess::null_mutex_family,boost::interprocess::offset_ptr<void>>,
boost::interprocess::flat_map_index>
my_mapped_file;
В процессе А, я делаю:
m_managedMappedFile.reset(new my_mapped_file(bip::open_or_create, filename, filesize));
auto hdr = m_managedMappedFile->find_or_construct<Foo>(bip::unique_instance)();
auto x = m_managedMappedFile->find<Foo>(bip::unique_instance);
, который работает, как я ожидал бы, то есть он находит объект. Теперь, в процессе B:
m_managedMappedFile.reset(new my_mapped_file(bip::open_only, filename));
auto ret = m_managedMappedFile->find<Foo>(bip::unique_instance);
По какой-то причине метод находки возвращает нуль в процессе B. Я понимаю, что я должен делать что-то бесшабашное, но не могу понять это.
Может ли кто-нибудь помочь?
Как вы блокируете/синхронизируете? Потому что вам лучше знать, что вы делаете. Мне никогда не приходилось обойти блокировку на уровне 'managed_mapped_file' – sehe
@sehe Если я не использовал нулевой мьютекс, я просто не мог заставить его работать; выполнение find_or_construct (unique_instance)() работает, но затем поиск (unique_instance) в другом процессе, он будет ждать ожидания мьютекса (в priv_generic_find), даже если процесс A завершился! –
Что такое платформа, библиотеки/версии компилятора? – sehe