2009-01-02 20 views
7

मैंने सोचा कि मैं एक होस्ट के भीतर संचार के लिए सॉकेट के स्थान पर Boost.Interprocess's Message Queue का उपयोग करूंगा। लेकिन इसमें खोदने के बाद, ऐसा लगता है कि इस पुस्तकालय को किसी कारण से POSIX संदेश कतार सुविधा (जो मेरा लिनक्स सिस्टम समर्थन करता है) को छोड़ देता है, और इसके बजाय POSIX साझा स्मृति के शीर्ष पर लागू किया जाता है। इंटरफ़ेस इतना समान है कि आप इसे तुरंत अनुमान नहीं लगा सकते हैं, लेकिन ऐसा लगता है।बूस्ट संदेश कतार POSIX संदेश कतार पर आधारित नहीं है? चुनने के लिए असंभव (2)?

मेरे लिए नकारात्मक पक्ष यह है कि shm_open(3) के माध्यम से प्राप्त साझा स्मृति select(2) साथ प्रयोग करने योग्य होने के लिए के रूप में mq_open(3) के माध्यम से प्राप्त POSIX संदेश कतार के लिए विरोध प्रकट नहीं होता है, है।

ऐसा लगता है कि बूस्ट की लाइब्रेरी इस मामले में हार जाती है। क्या कोई समझता है कि यह क्यों होना चाहिए? यहां तक ​​कि यदि यह POSIX संदेश कतार केवल कुछ सिस्टम पर उपलब्ध है, तो भी मैं बूस्ट को उस सुविधा का उपयोग करने की अपेक्षा करता हूं जहां यह उपलब्ध है, और केवल जहां आवश्यक हो उसे फिर से कार्यान्वित करें। क्या पॉज़िक्स सिस्टम का कुछ गड़बड़ है जिसे मैं अभी तक पहचान नहीं पाया?

उत्तर

4

बूस्ट.इंटरप्रोसेस 'सिंक कक्षाओं का उपयोग करते समय मैं दूसरी स्थिति में इसी तरह की स्थिति में भाग गया: अर्थात् हालत वर्ग। इसे "जेनेरिक" तरीके से कार्यान्वित किया गया है, लेकिन जिस तरह से किया गया है वह एक कस्टम स्पिनलॉक का उपयोग करना है जो अत्यधिक अक्षम है (कम से कम ओएस एक्स पर)। सभी उद्देश्यों और उद्देश्यों के लिए यह सिंक कक्षाओं को बेकार बना दिया।

मेरे अनुभव में इंटरप्रोसेस लाइब्रेरी बहुत अपरिपक्व है। मैं इसे साझा मेमोरी के लिए उपयोग करता हूं, और यह बहुत अच्छी तरह से काम करता है लेकिन कुछ मोटे किनारे हैं और मुझे कुछ "गायब फीचर्स" जैसे कि गतिशील रूप से साझा मेमोरी इत्यादि जैसे आकार बदलना पड़ता है।

संक्षेप में, नहीं इस लाइब्रेरी को अभी तक चांदी की बुलेट होने की उम्मीद है। यह अच्छा है, लेकिन इस समय असाधारण नहीं है।

+0

ध्यान दें कि लिनक्स पर, कस्टम स्पिनलॉक का उपयोग करने के बजाय यह pshared mutexes और condition variables का उपयोग करता है, जो लगभग उसी प्रक्रिया के भीतर म्यूटेक्स के रूप में कुशल होना चाहिए। हालांकि, 'बूस्ट :: इंटरप्रोसेस' ऑब्जेक्ट्स पर चयन करने के लिए, आपको किसी डेटा को प्रश्न में ऑब्जेक्ट मॉनिटर करने की आवश्यकता होगी और कुछ डेटा प्रतीक्षा होने पर एक फीफो या ईवेंटफड को टक्कर मारनी होगी। – bdonlan

+0

फिर भी, क्यों कोई बढ़ावा नहीं है :: इंटरप्रोसेस उपलब्ध होने पर पॉज़िक्स म्यूक्यू का उपयोग नहीं करता है ... मैंने खुद को एक एमक्यू रोक दिया है कि Win32 पर निर्माण करते समय, मेरा अमूर्तता boost :: interprocess :: mqueue का उपयोग करता है और लिनक्स पर निर्माण करते समय, मेरा abstraction posix mqueue का उपयोग करता है। यह आसान था, यही कारण है कि मुझे कोई कारण नहीं मिल रहा है कि बूस्ट :: इंटरप्रोसेस ऐसा क्यों नहीं करता है। अपरिपक्वता? मैंने कुछ देखा है? –

1

हाँ, दुर्भाग्यवश यह नहीं है। स्रोतों को खोदने के बाद मुझे यह भी निराश था।

लेकिन यहाँ इस तथ्य की अन्य (अच्छा) की ओर है: अगर आपके प्रोग्राम boost::asio का उपयोग करता है, तो आप लपेट कर सकते हैं POSIX संदेश के रूप में एपीआई कतार सिर्फ एक और आंकड़ारेख डेटा स्रोत और इस (IMHO) भी बेहतर होगा उपयोग करने के लिए अगर यह boost::interprocess का एक हिस्सा थे ... यह काफी गैर तुच्छ होगा, लेकिन (IMHO) निश्चित रूप से इस योग्य है, तो आप एक एकीकृत रास्ते में w/MQ काम करते हैं और बिजली अन्य boost::asio सामान का उपयोग कर सकते हैं ...

... मेरे अगले प्रोजेक्ट में यदि मुझे फिर से पॉज़िक्स एमक्यू की आवश्यकता होगी, तो मैं निश्चित रूप से इस तरह से ले जाऊंगा :)

+0

मुझे संदेश कतार के लिए boost :: asio का उपयोग करने के बारे में एक ही विचार था, जैसा कि आप प्रस्तावित करते हैं, बस एक और डेटाग्राम स्रोत के रूप में। क्या आपको :: एएसओ को बढ़ावा देने के लिए डेटाग्राम स्रोत जोड़ने का कोई अनुभव था? मैंने बूस्ट से कुछ स्रोत कोड पढ़कर विषय की सतह को मुश्किल से खरोंच कर दिया है, लेकिन मुझे इस विषय पर अभी तक अच्छा डॉकू/ट्यूटोरियल नहीं मिला है ... –

संबंधित मुद्दे