Boost interprocess Win32, x64

南笙酒味 提交于 2019-12-08 05:34:13

问题


I want to communicate between different platforms using boost interprocess.

I am using vc12 and boost 1.58 on windows 7.

My code below is a very simple example, that should work. But it doesn't for communications between diffrent platforms...

If I create msm in x64 and open in win32, the process stuck at a lock at function try_based_lock in boost/int/sync/detail/common_algorithms.hpp

In the other way around: win32 create, x64 open: the process crashes at name_length in segment_manager_helper.hpp whilr trying to find the name in index (priv_generic_find in segment_manager).

The problem occurs at msm.find("Data")

#include <iostream>
#include <boost/interprocess/managed_shared_memory.hpp>

int main() {
  namespace bip = boost::interprocess;

  // open in WIN32, create in x64
#ifndef _WIN64
  bip::managed_shared_memory msm(bip::open_only, "TestIPC");
#else
  bip::shared_memory_object::remove("TestIPC");
  bip::managed_shared_memory msm(bip::create_only, "TestIPC", 4096);
  msm.construct<uint32_t>("Data")[1](10);
#endif

  // Get Data and print it
  auto data = msm.find<uint32_t>("Data");
  if (data.second == 1) {
    std::cout << *data.first << std::endl;
  }

  std::cin.ignore();

  return 0;
}

Does anybody have experience in this?


回答1:


boost::interprocess communication between 32 bit and 64 bit mode using managed shared memory classes seems to be either not supported or a bug. On the lower level that is working fine though. Here is the sample code:

#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>

int main(int argc, char *argv[])
{
    using namespace boost::interprocess;

#ifndef _WIN64
    shared_memory_object shm(open_only, "MySharedMemory", read_write);
    mapped_region region(shm, read_only);
    uint8_t *ptr = static_cast<uint8_t*>(region.get_address());
    std::cout << int32_t(*ptr) << std::endl;
#else
    shared_memory_object shm(create_only, "MySharedMemory", read_write);
    shm.truncate(4096);
    mapped_region region(shm, read_write);
    uint8_t *ptr = static_cast<uint8_t*>(region.get_address());
    *ptr = 5;
#endif

    return 0;
}


来源:https://stackoverflow.com/questions/31696326/boost-interprocess-win32-x64

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!