2015-02-17 22 views
8

std :: mutex को महत्वपूर्ण वर्गों के साथ कार्यान्वित किया गया है, यही कारण है कि यह ओएस म्यूटेक्स (विंडोज़ पर) से बहुत तेज है। हालांकि यह Windows CRITICAL_SECTION जितना तेज़ नहीं है।क्यों std :: mutex धीमा है CRITICAL_SECTION

समय बस एक ही धागे में एक तंग पाश:

423.76ns ATL CMutex 
41.74ns std::mutex 
16.61ns win32 Critical Section 

मेरा प्रश्न म्युटेक्स कर और क्या एसटीडी है ::? मैंने स्रोत को देखा लेकिन इसका पालन नहीं कर सका। हालांकि क्रिट सेक्शन में आने से पहले अतिरिक्त कदम थे। मेरे प्रश्न हैं: क्या ये अतिरिक्त कदम उपयोगी हैं? यही है, के लिए अतिरिक्त कदम क्या हैं; CRITICAL_SECTION का उपयोग करके मुझे क्या याद आएगा?

इसके अलावा यदि उन्होंने म्यूटेक्स के साथ लागू नहीं किया है तो उन्होंने इसे म्यूटेक्स क्यों कहा?

+4

आप क्या समय दे रहे हैं? एक म्यूटेक्स बनाना, इसे लॉक करना, इसे अनलॉक करना, ...? Win32 mutex से भिन्नता तक: Win32 mutex एक क्रॉस-प्रोसेस म्यूटेक्स है। मानक केवल क्रॉस-थ्रेड म्यूटेक्स के लिए कॉल करता है, जो हल्का वजन निर्माण (और एक महत्वपूर्ण खंड के साथ विंडोज़ लागू) हो सकता है। –

+1

सीएमयूटेक्स को म्यूटेक्स के साथ कार्यान्वित किया गया है, यह सस्ता नहीं है। std :: mutex कंसुरेंसी रनटाइम के शीर्ष पर बनाया गया है, यह कार्यक्षमता के साथ कोड का एक हिस्सा है जो ओएस द्वारा प्रदान किए गए थ्रेडिंग और शेड्यूलिंग प्राइमेटिव से काफी विस्तारित है। लेयरिंग भारी है, जो मुफ्त में नहीं आती है। यदि कोई आलोचक आपके उद्देश्य की सेवा करता है और उपरांत वास्तव में मायने रखता है तो समस्या का शिकार करें और इसका इस्तेमाल करें। –

+1

मैं बस लॉक/अनलॉक करने का समय था। मैं सिर्फ उत्सुक हूं कि std :: mutex आलोचक सेक से परे करता है। यदि यह उपयोगी है तो क्या मुझे यह नहीं चाहिए? यदि यह उपयोगी नहीं है तो यह क्यों करता है? सोचने में मैं std :: mutex का उपयोग करूंगा लेकिन मैं बस सोच रहा हूं कि यह अतिरिक्त क्या करता है। – Philip

उत्तर

3

एक std :: mutex गैर-पुनरावर्ती स्वामित्व अर्थशास्त्र प्रदान करता है। एक CRITICAL_SECTION रिकर्सिव अर्थशास्त्र प्रदान करता है। तो मुझे लगता है कि इस अंतर को हल करने के लिए std :: mutex कार्यान्वयन में अतिरिक्त परत (कम से कम भाग में) है।

अपडेट: कोड के माध्यम से कदम, ऐसा लगता है कि std :: mutex को क्लासिकल Win32 CRITICAL_SECTION के बजाय कतार और इंटरलॉकएक्स निर्देशों के संदर्भ में लागू किया गया है। भले ही std :: mutex गैर-पुनरावर्ती है, आरटीएल में अंतर्निहित कोड वैकल्पिक रूप से रिकर्सिव और यहां तक ​​कि समय के ताले को संभाल सकता है।

+0

यह लगता है कि std :: recusive_mutex मेरे परीक्षणों में तेज़ था std :: mutex नहीं है। जो बताता है कि वे दोनों उन्हें धीमा करने के लिए कुछ कर रहे हैं जो ऑर्थोगोनल है कि वे रिकर्सिव हैं या नहीं, है ना? – Philip

+4

चूंकि यह यूबी को 'std :: mutex' को दोबारा लॉक करने का प्रयास करने के लिए है, इसलिए मुझे नहीं लगता कि "अंतर को हल करने" के लिए कोड की आवश्यकता क्यों होगी। –

+0

शायद यह यूबी का पता लगाने के लिए डीबग कोड है? क्या रिलीज या डीबग का उपयोग कर समय किया गया था? –

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