Я пытаюсь заставить boost::interprocess разделить память между 32-битными и 64-битными процессами. Эта запись в системе отслеживания ошибок предполагает, что это возможно в 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
дало те же результаты.
Есть ли способ заставить это работать?
uint32_t
вместоunsigned int
в случае межархитектурного кода, это может быть проблемой в зависимости от вашего компилятора. Я также использую boost ipc для связи x86 64‹-›32 в Windows с использованием компилятора Visual C++ 10.0 с boost 1.50, и он работает как шарм. - person ch0kee   schedule 26.09.2013CreateFileMapping
,CreateMutex(NULL, FALSE, ...)
). - person Andreas Haferburg   schedule 10.08.2015