2012-08-11 71 views
6

好日子夥計,64位和32位進程互通boost :: message_queue

我目前正試圖想象一種方式來傳遞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位。但如果這兩個過程不一樣,則不起作用。

升壓尋找更深(1.50.0)的代碼,你會看到在message_queue_t以下行:: do_receive(升壓/間/ IPC/message_queue.hpp):

scoped_lock lock(p_hdr->m_mutex);

出於某種原因,在當處理異構進程時,互斥鎖似乎被鎖定。我瘋狂的猜測是互斥體被抵消了,因此它的價值被破壞了,但我不太確定。

我想完成一些根本不支持的功能嗎?

任何幫助或建議將不勝感激。

+1

這不是一個瘋狂的猜測,這是準確的。他們把互斥量放在共享內存中,並且它的大小取決於位數。你無法完成這項工作。 – 2012-08-11 19:10:01

回答

5

我認爲這是關於message_queue中使用的offset_ptr指向每個消息(包括頭互斥鎖)的可移植性的。自Boost 1.48.0開始,應支持32位/ 64位互操作性,如https://svn.boost.org/trac/boost/ticket/5230中所述。

繼票建議,以下定義(到目前爲止)工作得很好,我在message_queue的leiu:

typedef message_queue_t< offset_ptr<void, int32_t, uint64_t> > interop_message_queue; 

在MSVC下升壓1.50.0,這也似乎需要在message_queue一個小補丁.hpp解決模板歧義:在調用ipcdetail :: get_rounded_size(...)時強制參數。

+0

謝謝詹姆斯!查看源代碼,該模板錯誤在[1.57](http://www.boost。org/doc/libs/1_57_0/boost/interprocess/ipc/message_queue.hpp),但仍存在於[1.56](http://www.boost.org/doc/libs/1_56_0/boost/interprocess/ipc/message_queue .HPP)。 – 2016-09-16 12:05:24

1

我已經花了整整一個工作日的數字解決方案,並最終讓它工作。該解決方案部分是由James提供的,因此我在32位和64位進程上都使用了interop_message_queue。

typedef boost::interprocess::message_queue_t< offset_ptr<void, boost::int32_t, boost::uint64_t>> interop_message_queue; 

的問題是,這個修改的代碼將無法編譯,所以我還必須添加以下,這是我升壓bug報告列表(#6147: message_queue sample fails to compile in 32-bit)上發現,這段代碼有之前的地方該提升包括message_queue:

​​