2013-03-10 4 views
9

मैं इस WebSocket में std::queue के लिए boost::lockfree::queue स्थानापन्न कोशिश कर रहा हूँ ++ उदाहरण https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppबढ़ावा है :: lockfree :: queue C++ 11 के साथ लॉकफ्री नहीं है?

ऐसा लगता है कि यह वास्तव में अभी तक boost::unique_lock लाइनों को हटाने के किसी भी वाक्य रचना को बदले बिना किया जा सकता है।

हालांकि, जब मैं बढ़ावा उदाहरण देखते हैं, यह एक कोड अनुभाग कि lockfree http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

लिए जाँच करता है जब मैं lockfree::queue पर डॉक्स के माध्यम से देखने के लिए है, यह is_lock_free()http://boost-sandbox.sourceforge.net/doc/html/boost/lockfree/queue.html पर इस का कहना है:

बूल is_lock_free (शून्य) कॉन्स;

चेतावनी

यह केवल चेक, अगर कतार सिर और पूंछ नोड्स और freelist एक ताला मुक्त ढंग से संशोधित किया जा सकता। अधिकांश प्लेटफ़ॉर्म पर, संपूर्ण कार्यान्वयन लॉक-फ्री है, यदि यह सत्य है। सी ++ 0x-style परमाणुओं का उपयोग करके, पूरी तरह सटीक कार्यान्वयन प्रदान करने की कोई संभावना नहीं है, क्योंकि प्रत्येक को प्रत्येक आंतरिक नोड, का परीक्षण करने की आवश्यकता होगी, जो ऑपरेटिंग सिस्टम से आगे नोड आवंटित किए जाने पर असंभव है।

देता है: सत्य, यदि कार्यान्वयन लॉक-फ्री है।

मुझे पता नहीं है क्या "C++ 0x शैली एटोमिक्स" हैं, लेकिन मैं बहुत यकीन है कि C++ 0x मतलब C++ 11।

मैं C++ 11 का उपयोग कर रहा है और सिर्फ std::queue के लिए boost::lockfree::queue प्रतिस्थापन, तो यह lockfree लागू नहीं किया जाएगा?

+5

मैं आपको लॉक-फ्री एल्गोरिदम को करने से पहले मापने का आग्रह करता हूं - वे साफ हैं लेकिन _scalable_ और _safe_ (यानी प्राथमिकता उलटा रोकें) - प्रदर्शन कम चिंता का विषय है और आमतौर पर खराब है। उदाहरण के लिए, बूस्ट का लॉक-फ्री कतार कार्यान्वयन लॉक 'std :: queue' से धीमा हो जाएगा जब तक कि आपके पास कई कोर और बहुत अधिक मात्रा में विवाद न हो। –

+2

'मुझे नहीं पता कि "सी ++ 0x-style परमाणु" क्या हैं [बूस्ट :: परमाणु] (http://www.boost.org/doc/libs/1_53_0_beta1/doc/html/atomic। एचटीएमएल) जो लाइब्रेरी पर निर्भर करता है। –

+0

lib उदाहरण के लिए +1 – ExoticBirdsMerchant

उत्तर

8

सं टिप्पणी "कोई संभावना नहीं एक पूरी तरह से सही कार्यान्वयन प्रदान करने के लिए" is_lock_free() को संदर्भित करता है - यानी यह गारंटी नहीं है कि is_lock_free() जिसके परिणामस्वरूप सही ढंग से कार्यान्वयन मुक्त ताला है कि क्या दर्शाता है देता है। हालांकि, अगर is_lock_free() सच हो जाता है, तो यह काफी संभावना है कि कार्यान्वयन लॉक मुक्त है - लेकिन बिल्कुल नहीं, कच्चा लोहे की गारंटी है।

+0

धन्यवाद-आप! क्या आप कहेंगे कि ऊपर दिए गए उदाहरण के साथ उपयोग करना सुरक्षित है, या क्या मुझे नियमित आधार पर खोए गए संदेश/कनेक्शन की उम्मीद करनी चाहिए? –

+0

आप कुछ खोने की उम्मीद क्यों करेंगे? –

+0

@CoryNelson क्योंकि मैं पूरी तरह से C++ अनुभवहीन हूं। 'is_lock_free' यह ध्वनि बनाता है जैसे ऐसी स्थितियां हो सकती हैं जहां यह लॉक नहीं है, इसलिए खोए गए संदेशों/कनेक्शन की तरह कुछ" बुरा "हो सकता है। –

-7

मुझे पता नहीं है क्या "C++ 0x शैली एटोमिक्स" हैं, लेकिन मैं बहुत यकीन है कि C++ 0x मतलब C++ 11।

  • C++ 0x C++ 03 और/या C++ 07 सी ++ मानकों को दर्शाता है।
  • सी ++ 1 एक्स आमतौर पर सी ++ 11
  • सी ++ 1y सी ++ 11 उत्तराधिकारी को संदर्भित करता है।
+6

यह पूरी तरह गलत है। सी ++ 0x और सी ++ 1x दोनों सी ++ 11 का संदर्भ लें। सी ++ 1y या तो सी ++ 14 या सी ++ 17 को संदर्भित करता है, लेकिन आम तौर पर पूर्व। –

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