我想获得boost :: interprocess共享32位和64位进程之间的内存。 这个错误跟踪器条目表明,这可能是在我使用的Boost 1.49中可能的。
作为一个testing,我试着分享一个unsigned int。 这是一个简单的Qt应用程序与两个button。
#define SHARED_MEMORY_NAME "My shared memory" #define SHARED_VAR_NAME "testVar" namespace bip = boost::interprocess; void on_createMemButton_clicked() { std::cout << "sizeof(unsigned int): " << sizeof(unsigned int) << std::endl; bip::shared_memory_object::remove(SHARED_MEMORY_NAME); bip::managed_shared_memory mem(bip::create_only, SHARED_MEMORY_NAME, 12345); mem.construct<unsigned int>(SHARED_VAR_NAME)(42); std::cout << "Created shared memory " << SHARED_MEMORY_NAME << std::endl; } void on_accessMemButton_clicked() { try { std::cout << "sizeof(unsigned int): " << sizeof(unsigned int) << std::endl; bip::managed_shared_memory mem(bip::open_only, SHARED_MEMORY_NAME); std::pair<unsigned int*, size_t> p = mem.find<unsigned int>(SHARED_VAR_NAME); std::cout<< "got " << p.second << " numbers " << std::endl; if (p.second > 0) std::cout << "first number is: " << *p.first << std::endl; bip::shared_memory_object::remove(SHARED_MEMORY_NAME); } catch (bip::interprocess_exception e) { std::cout << "Shared mem " << SHARED_MEMORY_NAME << " not found" << std::endl; } }
如果我创build或访问具有相同位数的进程的共享内存,它没有任何问题。 但是,如果我在64位进程中创build内存,并从32位进程读取,则进程将进入managed_shared_memory::find()
函数,并且永远不会返回。 如果我反过来尝试,64位进程再次在managed_shared_memory::find()
中失败,这次是访问冲突。 使用managed_windows_shared_memory
取得了相同的结果。
有什么办法可以做这个工作吗?
我有同样的问题。 我有一个运行在另一个进程内的DLL和一个独立编译的控制器程序。 我find()和find_or_construct()会挂起,使它看起来像一个死锁。 更改为null_mutex_family什么都没做。
问题原来是用来编译DLL与控制器应用程序的字符类型。 设置两个使用多字节字符为我(使用MSVC)修复它。
我将这行添加到我的代码中,以便在访问我的managed_shared_memory实例之前,永远不会再这样咬我。
if (sizeof(char) != 2) throw std::exception("Set your chars right");
如果你尝试用一种类型的char来查找和构造对象,那么从另一个类型的应用程序中,boost会挂在一个无尽的循环中(我没有耐心去尝试和发现)。