我试图让 boost::interprocess 在 32 位和 64 位进程之间共享内存。此错误跟踪器条目 https://svn.boost.org/trac/boost/ticket/5230表明这在我使用的 Boost 1.49 中可能是可能的。
作为测试,我尝试共享一个无符号整数。这是一个带有两个按钮的简单 Qt 应用程序。
#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;
}
}
如果我从具有相同位数的进程创建或访问共享内存,它就可以正常工作。但是,如果我在 64 位进程中创建内存,并从 32 位进程中读取,则该进程会进入managed_shared_memory::find()
功能并且永远不会回来。如果我反过来尝试,64 位进程会失败managed_shared_memory::find()
再次出现访问冲突。使用managed_windows_shared_memory
产生了相同的结果。
有什么办法可以让这个工作吗?
我有同样的问题。我有一个 DLL 在另一个进程中运行,并且有一个单独编译的控制器应用程序。我的 find() 和 find_or_construct() 会挂起,使其看起来像死锁。更改为 null_mutex_family 没有任何作用。
问题最终出在用于编译 DLL 与控制器应用程序的 char 类型上。将两者设置为使用多字节字符为我解决了这个问题(使用 MSVC)。
我将这一行添加到我的代码中,这样它就永远不会再像那样咬我了,就在访问我的托管共享内存实例之前。
if (sizeof(char) != 2) throw std::exception("Set your chars right");
如果您尝试从使用另一种类型的应用程序中查找使用一种类型的 char 构造的对象,则 boost 将陷入无限循环(我没有耐心尝试和查找)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)