2016-01-21 10 views
6

मुझे आश्चर्य है कि क्यों मैं इस में सी ++ 14 (या 17) ऐसा नहीं कर सकतेस्थिति चर और साझा म्युटेक्स

std::shared_timed_mutex mutex; 
std::unique_lock<std::shared_timed_mutex> lock(mutex); 

std::condition_variable var; 

while(!some_condition) 
    var.wait(lock); 

स्थिति चर केवल std :: म्युटेक्स के साथ काम करने लगते हैं। पर क्यों?

+0

क्या आप इसके लिए अपना उपयोगकेस साझा कर सकते हैं? – inf

+0

इस बारे में अच्छा क्या है कि आप न केवल 'shared_timed_mutex' पर प्रतीक्षा कर सकते हैं जो ऊपर दिखाए गए "लिखने के लिए" लिखा गया है, आप' shared_lock' का उपयोग कर "लॉक पढ़ा" होने पर भी प्रतीक्षा कर सकते हैं। हो सकता है कि आपको तब तक इंतजार करना पड़े जब तक एक लेखक थ्रेड जानकारी अपडेट नहीं करता है ताकि आप इसे प्रकाशित कर सकें। –

+0

केस का उपयोग थोड़ा जटिल है: मेरे पास एक वैश्विक (अब के लिए) पढ़ने/लिखने के लॉक के साथ डेटास्टोर है। और प्रति वस्तु ताले भी। यदि मैं किसी ऑब्जेक्ट को प्राप्त करता हूं तो मैं पहले वैश्विक लॉक को लॉक करता हूं, ऑब्जेक्ट पुनर्प्राप्त करता हूं, ऑब्जेक्ट लॉक करता हूं, और फिर वैश्विक लॉक जारी करता हूं। अब ऐसा मामला हो सकता है जहां कोई वस्तु हटा दी जाए। तो मैं ऑब्जेक्ट लॉक पर इंतजार नहीं करना चाहता (क्योंकि वह ताला भी नष्ट हो जाएगा) लेकिन इसके बजाय एक शर्त चर है जो कुछ बदलते समय थके हुए थ्रेड उठता है। शायद सबसे अच्छा डिज़ाइन नहीं है लेकिन यह डेडलॉक्स से मुक्त है और अधिक मेमोरी का उपयोग नहीं करता है। –

उत्तर

9

यह मानक द्वारा परिभाषित किया गया है ताकि कार्यान्वयन की अधिकतम दक्षता की अनुमति दी जा सके। यदि आप condition_variable के साथ एक अलग लॉक का उपयोग करना चाहते हैं तो आपको condition_variable_any का उपयोग करने की आवश्यकता है। ध्यान दें कि condition_variable_any कार्यान्वयन में कुछ ओवरहेड है। मानक से

उद्धरण: 30.5 स्थिति चर

कक्षा condition_variable एक शर्त चर प्रदान करता है कि यह कर सकते हैं प्रकार unique_lock<mutex> की एक वस्तु, कुछ प्लेटफॉर्म पर अधिकतम effciency अनुमति देने पर केवल इंतजार।

+0

आपको बहुत बहुत धन्यवाद! मुझे नहीं पता था कि यह अस्तित्व में था! –

+0

@ टी.सी. धन्यवाद, यह पता लगाने की कोशिश कर रहा था कि यह काम कैसे करें :) – inf

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