2012-01-06 19 views
14

मुझे शायद कुछ स्पष्ट याद आ रही है, लेकिन मुझे std::condition_variable और std::condition_variable_any के बीच कोई अंतर नहीं दिखाई दे रहा है। हमें दोनों की आवश्यकता क्यों है?std :: condition_variable और std :: condition_variable_any के बीच क्या अंतर है?

उत्तर

12

std::condition_variable अधिक विशिष्ट है, और इसलिए std::condition_variable_any की लचीलापन की आवश्यकता नहीं होने पर अधिक कुशल हो सकता है।

N3290 से §30.5 [thread.condition]/1

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

वास्तव में, LLVM के libC++ में, condition_variable_any अधिक विशिष्ट condition_variable (जो का उपयोग करता है pthread_cond_t) एक shared_mutex पर का उपयोग कर कार्यान्वित किया जाता है।

+0

की जाँच धन्यवाद। यह मुझे पागल बना रहा था। मैं बस इसे नहीं देख सका। –

16

अंतर wait() फ़ंक्शंस का पैरामीटर है। std::condition_variable में सभी प्रतीक्षा फ़ंक्शंस std::unique_lock<std::mutex>& प्रकार का लॉक पैरामीटर लें, जबकि std::condition_variable_any के लिए प्रतीक्षा फ़ंक्शन सभी टेम्पलेट्स हैं, और Lockable& प्रकार का लॉक पैरामीटर लें, जहां Lockable टेम्पलेट पैरामीटर है।

इसका मतलब है कि std::condition_variable_any उपयोगकर्ता परिभाषित म्युटेक्स और लॉक प्रकार के साथ काम कर सकते हैं, और boost::shared_lock जैसी चीजों के साथ --- कुछ भी lock() और unlock() सदस्य कार्यों है।

उदा।

std::condition_variable_any cond; 
boost::shared_mutex m; 

void foo() { 
    boost::shared_lock<boost::shared_mutex> lk(m); 
    while(!some_condition()) { 
     cond.wait(lk); 
    } 
} 

जानकारी के लिए सी ++ 11 धागा पुस्तकालय का सिर्फ :: धागा कार्यान्वयन के लिए दस्तावेज़ देखें:

std::condition_variable documentation

std::condition_variable_any documentation

या latest public draft of the C++11 standard

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