【发布时间】:2013-08-30 12:59:11
【问题描述】:
我正在尝试让 boost::interprocess 在 32 位和 64 位进程之间共享内存。 This bug tracker entry 建议这在我使用的 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 产生了相同的结果。
有什么办法可以做到吗?
【问题讨论】:
-
多么奇怪……在 Unix 风格的操作系统上,我绝对希望它能够工作,但我不知道它在 Windows 下是如何工作的。
-
在跨架构代码的情况下,您应该使用
uint32_t而不是unsigned int,这可能是一个问题,具体取决于您的编译器。我也在使用 Visual c++ 10.0 编译器在 Windows 上使用 boost ipc 进行 x86 6432 通信,使用 boost 1.50,它就像一个魅力。 -
我遇到了同样的问题。有结果吗?
-
@Viatorus 我们最终直接使用了 Windows API(
CreateFileMapping、CreateMutex(NULL, FALSE, ...))。
标签: c++ windows boost-interprocess