2013-01-14 43 views
12

आप std::condition_variable साथ std::recursive_mutex गठबंधन कर सकते हैं, जिसका अर्थ है कुछ इस तरह है:क्या आप std :: condition_variable के साथ std :: recursive_mutex को जोड़ सकते हैं?

std::unique_lock<std::recursive_mutex> lock(some_recursive_mutex) 
some_condition_var.wait(lock); 

यदि यह अनुमति नहीं है, तो क्यों नहीं?

मैं वीसी ++ 11 का उपयोग कर रहा हूं।

उत्तर

16

यदि आप std::condition_variable_any का उपयोग करते हैं, तो आप लॉक करने योग्य अवधारणा का समर्थन करने वाले किसी भी प्रकार की ऑब्जेक्ट की अनुमति दे सकते हैं।

हालांकि, पुनरावर्ती म्युटेक्स के मामले में, आप यह सुनिश्चित करना है कि दिया धागा केवल एक बार पुनरावर्ती म्युटेक्स बंद कर दिया गया है, के बाद से हालत चर केवल unlock विधि unique_lock पर एक बार प्रतीक्षा के दौरान प्रयोग करेंगे की क्या ज़रूरत है।

+2

"आपको यह सुनिश्चित करना होगा कि दिए गए थ्रेड ने केवल एक बार रिकर्सिव म्यूटक्स को लॉक कर दिया है" -> जिसका अर्थ है कि आप रिकर्सिव म्यूटेक्स पर किसी शर्त का उपयोग नहीं कर सकते हैं, है ना? मेरा मतलब है कि किसी शर्त का उद्देश्य अन्य धागे के साथ सिंक करना है, और यह काम नहीं करेगा अगर म्यूटेक्स को प्रतीक्षा के दौरान अनलॉक करने की गारंटी नहीं है। –

+0

@ ह्यूगोमैक्सवेल यह आपके उपयोग के मामले पर निर्भर करता है। यदि आप जानते हैं कि आप अपने ताले में केवल 1 स्तर गहरे हैं, तो आप इसे स्थिति के साथ उपयोग कर सकते हैं। उदाहरण के लिए, यदि म्यूटेक्स की रिकर्सिव प्रकृति का उपयोग केवल स्थिति के सिग्नलिंग पक्ष पर किया जाता है, तो यह ठीक काम करेगा। –

2

आप इसे std::condition_variable_any के साथ कर सकते हैं जो किसी भी प्रकार का लॉक करने योग्य लेकिन सादा std::condition_variablestd::unique_lock<std::mutex> के लिए विशिष्ट है।