2014-09-02 9 views
8

मुझे लगता है कि विजुअल स्टूडियो 2013 में std::mutex कार्यान्वयन बहुत धीमा है। यह एक भारी वजन म्यूटेक्स का उपयोग करता है यह सुनिश्चित करने के लिए कि सिंक्रनाइज़ेशन को उन प्रक्रियाओं के बीच भी हासिल किया जा सकता है जो सभी ठीक और बेवकूफ हैं; जब तक आप अन्य प्रक्रियाओं से बात नहीं कर रहे हैं और वास्तव में उस अतिरिक्त गति का उपयोग कर सकते हैं जो CRITICAL_SECTION Win32 पर स्पिन-लॉक ऑफ़र के साथ है।क्या std :: condition_variable द्वारा उपयोग के लिए सी ++ 11 म्यूटेक्स अवधारणा को कार्यान्वित करना संभव है?

मैंने fast_recursive_mutex को लागू करने का प्रयास किया जो सी ++ 11 म्यूटेक्स अवधारणा का पालन करता है और यह spec के अनुसार सभी दायित्वों को पूरा करता है। सभी इंद्रियों में, जब तक आप प्रक्रियाओं के बीच सिंक्रनाइज़ नहीं कर रहे हैं, तब तक std::mutex के लिए यह एक ड्रॉप-इन प्रतिस्थापन है।

यह std::lock_guard और std::unique_lock के साथ बढ़िया काम करता है। हालांकि std::condition_variable के साथ इसका उपयोग करने का प्रयास करते समय मुझे समस्याएं आती हैं क्योंकि std::condition_variable::wait(std::unique_lock<std::mutex>&) को std::mutex के हार्ड कोड किए गए उपयोग के कारण स्वीकार नहीं करता है।

तो मेरी प्रश्न हैं:

  1. क्यों wait()std::mutex से एक और म्युटेक्स प्रकार स्वीकार नहीं करता है?
  2. क्या मैं इसके बारे में कुछ कर सकता हूं? (पुन: कार्यान्वयन की स्थिति को कम करने योग्य _ariable)।
+0

"यह एक और प्रकार क्यों स्वीकार नहीं करता है" का पहला सवाल है, आप यह भी पूछ सकते हैं कि उन्होंने दो अलग-अलग 'condition_variable' कक्षाएं क्यों लिखीं और न केवल एक प्रकार के टेम्पलेट म्यूटेक्स प्रकार के साथ। – CashCow

उत्तर

6

आप किसी भी ताला-युक्त प्रकार के लिए std::condition_variable_any उपयोग कर सकते हैं।

+0

क्या आपके पास पहले प्रश्न के बारे में कोई विचार है? – anderas

+1

@anderas: http://stackoverflow.com/questions/8758353/whats-the-difference-between-stdcondition-variable-and-stdcondition-variable –

+2

मुझे विश्वास नहीं है कि मैंने दोनों को याद किया जब मैंने संदर्भों को देखा और जब googling ... धन्यवाद! –

0

मेरा मानना ​​है कि विजुअल स्टूडियो 2012/2013 में std::mutex कार्यान्वयन पहले से ही महत्वपूर्ण वर्गों का उपयोग करता है। बस VSDIR\VC\crt\thr\mutex.c

आप अनुभवी रूप से std::mutex::native_handle() विधि का उपयोग करके इसे जांच सकते हैं और CRITICAL_SECTION पर वापस लौटा सकते हैं।

+1

कई लोगों ने इसे माप लिया है: उदाहरण के लिए http://stackoverflow.com/a/18092273/2498188 और http://stackoverflow.com/a/24470878/2498188 यहां। मेरे स्वयं के माप इनके साथ सहमत हैं .. –

+0

मेरा बिंदु था वीएस सचमुच भारी वजन आईपीसी-सक्षम म्यूटेक्स का उपयोग नहीं करता बल्कि बल्कि 'Concurrency :: critical_section' का उपयोग करता है, किसी भी तरह से (VC \ crt \ src में' critical_section :: _ Acquire_lock() 'जांचें \ rtlocks.cpp) 'CRITICAL_SECTION' से धीमा है। – kozmo

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