2013-04-08 12 views
12

सी ++ 11 बिना घटना अधिसूचना std :: condition_variable है, इसकी प्रतीक्षा समारोहम्युटेक्स

template< class Predicate > 
void wait(std::unique_lock<std::mutex>& lock, Predicate pred); 

यह एक म्युटेक्स की आवश्यकता है।

जहां तक ​​मैं समझता हूँ - अपने notify_one तुल्यकालन बिना कहा जा सकता है (मैं जानता हूँ कि मुहावरेदार तरह से एक म्युटेक्स के साथ उपयोग करने के लिए है)। इसलिए मैंने इसे बचाने के लिए एक म्युटेक्स जरूरत नहीं है -

मैं एक वस्तु जो पहले से ही आंतरिक रूप से सिंक्रनाइज़ है। एक धागे को उस वस्तु से जुड़े कुछ घटनाओं के लिए इंतजार करना चाहिए, और अन्य को अधिसूचित किया जाएगा।

कैसे सी ++ 11 में एक म्युटेक्स के बिना इस तरह अधिसूचना करना है? अर्थात। एक condition_variable के साथ करना आसान है, लेकिन इसे एक म्यूटेक्स की आवश्यकता है। मैंने नकली म्यूटेक्स प्रकार का उपयोग करने के बारे में सोचा, लेकिन std :: mutex प्रतीक्षा इंटरफ़ेस में खींचा गया है।

एक विकल्प एक std :: atomic_flag + नींद मतदान पर है, लेकिन मैं सो पसंद नहीं है।

उत्तर

11

std::condition_variable_any का उपयोग करें आप इसके साथ किसी भी कक्षा का उपयोग कर सकते हैं जो BasicLockable संकल्पना लागू करता है।

इस को लेकर बुरा विचार को देखते हुए मैं libc की std::condition_variable_any के कार्यान्वयन ++ जाँच की। ऐसा लगता है कि यह एक सादा std::condition_variable एक साथ उपयोग करता है एक std::mutex करने के लिए एक std::shared_ptr साथ है, इसलिए निश्चित रूप से कुछ भूमि के ऊपर किसी भी गहन जानकारी के बिना शामिल है। (, कुछ अन्य जो इस को शामिल किया गया इतने पर यहाँ पोस्ट है, हालांकि मैं पहली बार है कि खोज करने के लिए है)
कि की बात मैं शायद अपने मामले नया स्वरूप इतना है कि तुल्यकालन वास्तव में केवल एक म्युटेक्स एक सादे हालत की रक्षा करने द्वारा किया जाता है की सिफारिश करेंगे के रूप में चर।

+0

है कि मैं वास्तव में क्या देख रहा हूँ, मैं इसके बारे में पता नहीं था। धन्यवाद! – qble

+0

"ऐसा लगता है कि यह एक सादा std :: condition_variable एक साथ एक एसटीडी के साथ shared_ptr एक std :: म्युटेक्स का उपयोग करता है ::, इसलिए वहाँ निश्चित रूप से कुछ भूमि के ऊपर किसी भी गहन जानकारी के बिना शामिल है।" - दिलचस्प, क्या यह ** notify_one ** के भीतर आंतरिक म्यूटेक्स को लॉक करता है? क्या सादे std :: condition_variable के बारे में - यह ** notify_one के साथ किसी भी म्युटेक्स ताले करता **? – qble

+0

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

5

कुछ सूत्रण मॉडल में (हालांकि मैं आधुनिक लोगों में संदेह) म्युटेक्स की रक्षा के लिए की जरूरत है हालत चर ही (नहीं वस्तु आप सिंक्रनाइज़ कर रहे हैं) समवर्ती उपयोग से। यदि स्थिति परिवर्तक को mutex द्वारा संरक्षित नहीं किया गया था तो आपको स्थिति पर समस्याएं आ सकती हैं।

Why do pthreads’ condition variable functions require a mutex?

+2

मुझे लगता है कि std :: condition_variable_any :: notify_one को सुरक्षा के लिए mutex की आवश्यकता नहीं है - यह आईएसओ द्वारा है। अगर कुछ आर्किटेक्चर को Notify_one की सुरक्षा की आवश्यकता होगी - पुस्तकालय स्वयं ही ऐसा करेगा, अन्यथा यह मानक-अनुरूप नहीं होगा। – qble

+1

दिलचस्प जानकारी, धन्यवाद। हम पूर्ण सर्कल आ गए हैं। 'std :: condition_variable_any' को स्वयं की सुरक्षा के लिए एक आंतरिक' std :: mutex' रखता है। :-) –

+0

यही वह है जो मैं समझता हूं। यदि ** notify_one ** आईएसओ द्वारा सिंक्रनाइज़ नहीं किया जाएगा - तो हाँ, हमें इसके लिए बाहरी म्यूटेक्स चाहिए। – qble

1

देखें मैं कुछ वस्तु है, जो पहले से ही आंतरिक रूप से सिंक्रनाइज़ है - क्या मैं म्युटेक्स की जरूरत नहीं है उसे बचाने के लिए। एक धागे को उस वस्तु से जुड़े कुछ घटनाओं के लिए इंतजार करना चाहिए, और अन्य सूचित करेंगे।

आप म्युटेक्स प्रतीक्षा धागा, सूचना से वंचित करने के लिए भले ही आप आंतरिक म्युटेक्स साथ condition_variable या condition_variable_any का उपयोग हो रहा है पकड़ नहीं है, तो।

आप शर्त चर के साथ अतिरिक्त जानकारी की कम से कम एक बिट जोड़ने की आवश्यकता है, और इस बिट एक म्युटेक्स द्वारा संरक्षित किया जाना चाहिए।

+0

हां, मुझे इसके बारे में पता है, और यह उस स्थिति में स्वीकार्य है। – qble

+0

आप मेरी सजा समाप्त होने से चूक गए। यदि रेस स्थिति होती है तो उस स्थिति की जांच करते समय म्यूटेक्स नहीं होता है और फिर स्थिति चर पर प्रतीक्षा करता है। –

+0

[गैर-महत्वपूर्ण दौड़ की स्थिति] है (http://en.wikipedia.org/wiki/Race_condition#Critical_and_non-critical_race_conditions)। यह यूबी नहीं है। – qble

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