Повышение межпроцессного Win32, x64

Я хочу общаться между разными платформами, используя межпроцессорное ускорение.

Я использую vc12 и повышаю 1.58 на Windows 7.

Мой код ниже - это очень простой пример, который должен работать. Но это не для связи между разными платформами ...

Если я создаю msm в x64 и открываю в win32, процесс зависает в блокировке функции try_based_lock в boost / int / sync / detail / common_algorithms.hpp

И наоборот: win32 create, x64 open: процесс вылетает на name_length в segment_manager_helper.hpp при попытке найти имя в индексе (priv_generic_find в segment_manager).

Проблема возникает в msm.find («Данные»).

#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;
}

У кого-нибудь есть в этом опыт?


person Viatorus    schedule 29.07.2015    source источник
comment
У вас не должно быть _WIN32 undefined. Это может повлиять на библиотеки ускорения.   -  person dewaffled    schedule 29.07.2015


Ответы (1)


boost::interprocess связь между 32-битным и 64-битным режимами с использованием классов управляемой разделяемой памяти либо не поддерживается, либо является ошибкой. Однако на нижнем уровне это работает нормально. Вот пример кода:

#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;
}
person doqtor    schedule 07.08.2015