2012-11-16 8 views
7

मुझे null_mutex (वर्तमान में boost::interprocess::null_mutex) में ड्रॉप करने की क्षमता मिलती है जब मैं कुछ मामलों में सिंक्रनाइज़ेशन ओवरहेड और अन्य में वास्तविक म्यूटेक्स नहीं चाहता हूं।क्या सी ++ 11 (उदा। Std :: null_mutex) में boost :: interprocess :: null_mutex के बराबर है?

मैं C++ 11 mutex कक्षाएं नई उपयोग करने के लिए कोशिश कर रहा हूँ, लेकिन मैं null_mutex के लिए कोई समकक्ष देखते हैं - जो पत्ते मुझे हैरान ..

हाँ मैं जानता हूँ कि इसे लागू करने के तुच्छ है (या मैं उपयोग करने के लिए जारी रख सकते हैं को बढ़ावा देने, लेकिन जहां संभव हो मैं मानक रहना कोशिश कर रहा हूँ और एक छोटी सी चूक की तरह लगता है)

+1

नहीं, मानक में कोई शून्य mutex नहीं है। –

+0

@ बोपर्सन, मुझसे ज्यादा चालाक लोगों से सवाल न करें, लेकिन किसी भी कारण से (क्या यह बहुत छोटा है ..)? – Nim

+0

मुझे नहीं पता, मैंने इसे मानक के लिए प्रस्तावित नहीं देखा है। यह वास्तविक कारण हो सकता है कि यह क्यों नहीं है - किसी ने इसके लिए नहीं पूछा। :-) –

उत्तर

10

आप काफी तुच्छता से इस कर सकते हैं, Lockable अवधारणा का एक 'अशक्त' कार्यान्वयन बनाने के द्वारा:

struct null_mutex 
{ 
    void lock() {} 
    void unlock() noexcept {} 
    bool try_lock() { return true; } 
}; 

यह std :: lock_guard के साथ काम करेगा:

null_mutex mux; 
std::lock_guard<null_mutex> guard(mux); 
+0

लॉक करने योग्य आवश्यकताओं को पूरा करने के लिए आप 'bool try_lock() {true true;}' भी चाहते हैं। सभी मानक ताला वर्गों और कार्यों (कुछ कारणों से 'lock_guard' भी) की आवश्यकता है। –

+0

@ माइकसेमोर मैंने विशेष रूप से न्यूनतम अवधारणा आवश्यकताओं को लागू किया: ['std :: lock_guard'] (http://en.cppreference.com/w/cpp/thread/lock_guard) केवल [' BasicLockable'] (http: // en.cppreference.com/w/cpp/concept/BasicLockable)। आप निश्चित रूप से सही हैं और मैं – sehe

+0

'lock_guard' को स्पष्ट करता हूं 'लॉक करने योग्य' निर्दिष्ट करता है - 30.4.2.1/2 देखें। शायद यह एक त्रुटि है, क्योंकि इसका 'try_lock() 'का उपयोग करने के लिए कोई कल्पनीय कारण नहीं है, लेकिन यह मानक में है। –

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