2012-08-11 8 views
6

शुभ दिन लोग,64 बिट और 32 बिट प्रक्रिया ख़बर बढ़ावा :: message_queue

मैं वर्तमान में एक 64 बिट प्रक्रिया है और एक 32 बिट प्रक्रिया के बीच डेटा पास के लिए एक रास्ता निकालने की कोशिश कर रहा हूँ। चूंकि यह एक वास्तविक समय का एप्लिकेशन है और दोनों एक ही कंप्यूटर पर चल रहे हैं, मैं साझा स्मृति (श्म) का उपयोग करना कठिन हूं।

जब मैं shm का उपयोग कर कुछ तुल्यकालन तंत्र के लिए देख रहा था, मैं बढ़ावा पर महसूस किया :: 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 बिट कर रहे हैं:

मेरे कोड मूल रूप से पीछा कर रहा है। लेकिन काम नहीं करता है अगर दोनों प्रक्रिया एक जैसी नहीं हैं। (बढ़ावा/इंटरप्रोसेस/आईपीसी/message_queue.hpp)

बढ़ावा में गहरी खोज रहे हैं (1.50.0) कोड आप message_queue_t में निम्न पंक्ति :: do_receive देखेंगे:

scoped_lock lock(p_hdr->m_mutex);

किसी कारण से, में विषम प्रक्रियाओं के साथ काम करते समय म्यूटेक्स लॉक लगते हैं। मेरा जंगली अनुमान यह होगा कि म्यूटेक्स ऑफसेट हो गया है और इसलिए इसका मान दूषित है लेकिन मुझे पूरा यकीन नहीं है।

क्या मैं कुछ ऐसा करने की कोशिश कर रहा हूं जो कि समर्थित नहीं है?

कोई भी मदद या सलाह की सराहना की जाएगी।

+1

यह जंगली अनुमान नहीं था, यह सटीक है। उन्होंने म्यूटेक्स को साझा मेमोरी में रखा और यह उन सदस्यों द्वारा किया गया है जिनके आकार को गठबंधन पर निर्भर करता है। आप यह काम नहीं कर सकते। –

उत्तर

5

मुझे लगता है कि इस message_queue में प्रयोग किया जाता है, प्रत्येक संदेश को इंगित करने के हैडर म्युटेक्स सहित offset_ptr के पोर्टेबिलिटी के बारे में है। 32-/64-बिट इंटरऑपरेबिलिटी को बूस्ट 1.48.0 के बाद समर्थित किया जाना चाहिए, जैसा कि 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।संगठन/डॉक्टर/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)। –

1

मैंने अपना पूरा कार्यदिवस समाधान हल कर लिया है और आखिर में मैंने इसे काम किया है। समाधान आंशिक रूप से जेम्स ने प्रदान किया है, इसलिए मैंने 32-बिट और 64-बिट प्रक्रियाओं पर interop_message_queue का उपयोग किया।

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

समस्या यह है कि इस संशोधन के साथ कोड संकलन नहीं होता है, इसलिए मैं भी निम्नलिखित है, जो मैं बढ़ावा बग रिपोर्ट सूची (#6147: message_queue sample fails to compile in 32-bit) पर पाया जोड़ने के लिए किया था, इस कोड से पहले स्थान हो गया है बूस्ट में संदेश_क्यूयू शामिल है:

namespace boost { 
    namespace interprocess { 
    namespace ipcdetail { 
     //Rounds "orig_size" by excess to round_to bytes 
     template<class SizeType, class ST2> 
     inline SizeType get_rounded_size(SizeType orig_size, ST2 round_to) { 
     return ((orig_size-1)/round_to+1)*round_to; 
     } 
    } 
    } 
} 
संबंधित मुद्दे