大家好
我目前正在尝试一种在64位进程和32位进程之间传递数据的方法,因为这是一个实时应用程序,而且两者都在同一台计算机上运行,坚韧了共享内存(shm)。
当我在寻找一些使用shm的同步机制时,我在boost::message_queue上找到了。但是它不工作。
我的代码基本如下:
发送方部分
message_queue::remove("message_queue");
message_queue mq(create_only, "message_queue", 100, sizeof(uint8_t));
for (uint8_t i = 0; i < 100; ++i)
{
mq.send(&i, sizeof(uint8_t), 0);
}
接收方部分
message_queue mq(open_only, "message_queue");
for (uint8_t i = 0; i < 100; ++i)
{
uint8_t v;
size_t rsize;
unsigned int rpriority;
mq.receive(&v, sizeof(v), rsize, rpriority);
std::cout << "v=" << (int) v << ", esize=" << sizeof(uint8_t) << ", rsize=" << rsize << ", rpriority=" << rpriority << std::endl;
}
如果两个进程是64位或32位的,则此代码可以正常工作。但如果两个进程不相同,则无法工作。
深入查看boost(1.50.0)代码,您将在message_queue_t::do_receive(boost/interprocess/ipc/message_queue.hpp)中看到以下行:scoped_lock lock(p_hdr->m_mutex);
由于某种原因,在互斥体中,当处理异构进程时似乎被锁定了。我大胆的猜测是互斥体被偏移了,因此它的值被损坏了,但我不太确定。
我是否正在尝试完成一些根本不受支持的事情?
任何帮助或建议将不胜感激。
2条答案
按热度按时间7eumitmz1#
我认为这是关于message_queue中使用的offset_ptr指向每个消息的可移植性,包括头互斥体。自Boost 1.48.0以来,应该支持32-/64位互操作性,如https://svn.boost.org/trac/boost/ticket/5230中所述。
根据ticket的建议,以下定义(到目前为止)在message_queue的leiu中对我来说工作得很好:
在MSVC下的Boost 1.50.0上,这似乎也需要在message_queue.hpp中打一个小补丁来解决模板歧义:在调用ipcdetail::get_rounded_size(...)时强制转换参数。
af7jpaap2#
解决方案部分是James提供的,所以我在32位和64位进程上都使用了
interop_message_queue
。问题是,这样修改后代码无法编译,所以我还必须添加以下代码,这是我在boost bug报告列表(#6147: message_queue sample fails to compile in 32-bit)中发现的,这段代码必须放在message_queue的boost includes之前: