c++ - boost::32 和 64 位进程之间的进程间共享内存

标签 c++ windows boost-interprocess

我正在尝试让 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 产生了相同的结果。

有什么办法可以实现这个功能吗?

最佳答案

我也遇到了同样的问题。我有一个 DLL 在另一个进程中运行,并且有一个单独编译的 Controller 应用程序。我的 find() 和 find_or_construct() 会挂起,使其看起来像死锁。更改为 null_mutex_family 没有任何作用。

问题出在用于编译 DLL 与 Controller 应用程序的 char 类型上。将两者设置为使用多字节字符为我解决了这个问题(使用 MSVC)。

我将这一行添加到我的代码中,这样它就永远不会再像那样咬我了,就在访问我的 Managed_shared_memory 实例之前。

if (sizeof(char) != 2) throw std::exception("Set your chars right");

如果您尝试从使用另一种类型的应用程序中查找使用一种类型的 char 构造的对象,boost 将陷入无限循环(我没有耐心尝试和查找)。

关于c++ - boost::32 和 64 位进程之间的进程间共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18533527/

相关文章:

c++ - 访问 boost::geometry 多边形中的点数据时出错

c++ - 修改 Windows 磁盘驱动程序以使用更新的控制代码,如 IOCTL_DISK_GET_DRIVE_GEOMETRY_EX

c++ - 如何在 boost::interprocess 共享内存中获取命名对象列表

c++ - 如何获取内核对象的安全描述符?

c++ - 为什么 MPI_Barrier 会导致 C++ 中的段错误

c++ - 从智能指针获取所有权,并通过同一智能指针进一步访问原始指针

windows - 如何移动到某个选项卡上某个窗口中存在的非隐藏缓冲区?

windows - 音频输出(我听到的)到 UPnP 设备

c++ - 使用整数标识符在共享内存上构造对象

c++ - 在内存映射文件中存储 vector