2013-08-06 5 views
8

पर म्यूटेक्स, महत्वपूर्ण अनुभाग इत्यादि की लागत मैंने कहीं पढ़ा है कि म्यूटेक्स का ओवरहेड इतना नहीं है, क्योंकि संदर्भ स्विचिंग केवल विवाद के मामले में होती है।विंडोज

लिनक्स में फूटक्स भी जाना जाता है।

क्या वही चीज विंडोज में अच्छी है? क्या लिनक्स में म्यूटक्स के लिए गंभीर अनुभाग एक अधिक उपयुक्त मानचित्र है।

जो मैंने एकत्र किया, उससे क्रिटिकल सेक्शन म्यूटेक्स की तुलना में बेहतर इष्टतम प्रदर्शन प्रदान करते हैं, क्या यह हर मामले के लिए सच है?

क्या कोई कोने केस है जहां म्यूटेक्स विंडोज में महत्वपूर्ण अनुभाग से तेज़ हैं।

मान लें केवल एक ही प्रक्रिया-धागे mutexes तक पहुँच रहे हैं

जोड़ा जानकारी (बस गंभीर धारा के अन्य लाभ खत्म करने के लिए): ओएस विंडोज सर्वर,
भाषा सी ++

+0

बेशक, यदि आपके आवेदन में लगातार विवाद होता है, तो आप इस विचार पर पुनर्विचार कर सकते हैं कि म्यूटेक्स के पास बहुत अधिक उपर नहीं है। – patrickvacek

उत्तर

12

के विशेष उद्देश्य को ध्यान में रखते Critical Sections और Mutexes मुझे नहीं लगता कि आप लागत के बारे में एक प्रश्न पूछ सकते हैं क्योंकि आपके पास एक ही डेटा को छूने वाले एकाधिक धागे की आवश्यकता होने पर अधिक विकल्प नहीं है। जाहिर है, अगर आपको किसी संख्या को बढ़ाने/घटाने की आवश्यकता है, तो आप फ़ंक्शन volatile नंबर पर उपयोग कर सकते हैं और आप जाने के लिए अच्छे हैं। लेकिन कुछ और जटिल के लिए, आपको एक सिंक्रनाइज़ेशन ऑब्जेक्ट का उपयोग करने की आवश्यकता है।

Synchronization Objects available on Windows^ पर अपनी पढ़ाई शुरू करें। सभी कार्यों को सूचीबद्ध किया गया है, अच्छी तरह से समूहीकृत और सही तरीके से समझाया गया है। कुछ केवल विंडोज 8 हैं।

अपने प्रश्न के बारे में के रूप में, Critical Sections के रूप में वे एक ही प्रक्रिया में संचालित करने के लिए तैयार कर रहे हैं Mutexe रों की तुलना में कम महंगे हैं।this^ और this^ या केवल निम्न उद्धरण पढ़ें।

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

मैं पार प्रक्रिया तुल्यकालन के लिए एक ही प्रक्रिया तुल्यकालन के लिए Critical Sections और Mutexes का उपयोग करें।केवल तभी जब मुझे वास्तव में यह पता होना चाहिए कि सिंक्रनाइज़ेशन ऑब्जेक्ट को छोड़ दिया गया था, तो मैं उसी प्रक्रिया में म्यूटेक्स का उपयोग करता हूं।

इसलिए, यदि आप एक सिंक वस्तु की जरूरत है, सवाल नहीं है खर्च कर रहे हैं, लेकिन जो सस्ता है :) वहाँ वास्तव में कोई विकल्प नहीं स्मृति भ्रष्टाचार क्या।

पुनश्च: वहाँ one mentioned in the selected answer here^ की तरह विकल्प हो सकता है लेकिन मैं हमेशा कोर प्लेटफ़ॉर्म-विशिष्ट कार्यक्षमता बनाम पार platformness के लिए जाते हैं। यह हमेशा तेज है! तो अगर आप Windows का उपयोग, विंडोज :) के उपकरणों का उपयोग

अद्यतन

अपनी आवश्यकताओं के आधार पर, आप के रूप में ज्यादा आत्म करने के लिए कोशिश कर रहा द्वारा समन्वयन ऑब्जेक्ट की जरूरत को कम करने के लिए सक्षम हो सकता है एक थ्रेड में जितना संभव हो सके काम करता है और केवल अंत में या फिर डेटा को गठबंधन करता है।

बेवकूफ उदाहरण: यूआरएल की एक सूची लें। आपको उन्हें स्क्रैप करने और उनका विश्लेषण करने की आवश्यकता है।

  1. थ्रेड के समूह में फेंको और इनपुट सूची से, एक-एक करके यूआरएल चुनना शुरू करें। प्रत्येक प्रक्रिया के लिए आप परिणामों को केंद्रीकृत करते हैं जैसे आप करते हैं। यह वास्तविक समय और ठंडा है
  2. या आप इनपुट यूआरएल का टुकड़ा रखने वाले धागे में फेंक सकते हैं। यह चयन प्रक्रिया को सिंक करने की आवश्यकता को हटा देता है। आप विश्लेषण परिणाम को धागे में संग्रहीत करते हैं और अंत में, आप परिणाम को एक बार जोड़ते हैं। या सिर्फ एक बार हर 10 यूआरएल चलो कहते हैं। उनमें से प्रत्येक के लिए नहीं। यह नाटकीय रूप से सिंक संचालन को कम करेगा।

तो सही टूल चुनकर और लॉक को कम करने और अनलॉक करने के बारे में सोचकर लागत कम हो सकती है। लेकिन लागत हटाया नहीं जा सकता :)

पुनश्च: मैं केवल URL लगता है :)

अद्यतन 2:

एक परियोजना में जरूरत कुछ मापने करना था। और परिणाम काफी आश्चर्यजनक थे:

  • एक std::mutex सबसे महंगी है। (क्रॉस-platformness की कीमत)
  • एक विंडोज देशी Mutex 2x std से तेज है।
  • एक Critical Sectionदेशी Mutex की तुलना में तेजी 2x है।
  • एक SlimReadWriteLockCritical Section की + -10% है।
  • मेरे घर का बना InterlockedMutex (spinlock) 1.25x है - Critical Section की तुलना में तेजी 1.75x।
+0

मुझे पता था कि मैं लागत को हटा नहीं सकता था, लेकिन यह सोच रहा था कि महत्वपूर्ण अनुभाग या म्यूटेक्स मेरे लिए आदर्श हैं या नहीं। जानकारी के लिए धन्यवाद हालांकि –

+0

@DesertIce ने एक पोस्ट पोस्ट किया। अंत में यह सही है। अस्थिर के लिए – CodeAngry

+1

-1। थ्रेडिंग के लिए आपको अकेले अस्थिरता पर भरोसा नहीं करना चाहिए। या तो परमाणु का उपयोग करें, या स्मृति बाड़ के साथ अस्थिर गठबंधन। अन्यथा, उदाहरण के लिए, आपकी अस्थिर पहुंच लिनक्स/जीसीसी पर फिर से हो सकती है। –

0

std :: विंडोज़ 8 पर म्युटेक्स का उपयोग करते हुए मैं आमतौर पर अपने खुद के कस्टम मेड स्पिन ताला का उपयोग करके (गैर विवाद मामले पर) 3-4x सुधार पाने speedup:

म्युटेक्स आधारित

auto time = TimeIt([&]() { 
for (int i = 0; i < tries; i++) { 
    bool val = mutex.try_lock(); 
    if (val) { 
     data.value = 1; 
    } 
} 

});

घर ताला किए मुक्त

time = TimeIt([&]() { 
    for (int i = 0; i < tries; i++) { 
     if (!guard.exchange(true)) { 
      // I own you 
      data.value = 1; 
      guard.store(true); 
     } 
    } 
}); 

टेस्ट 86 पर किया जाता है।

मुझे पता नहीं लगा है कि std :: mutex विंडोज़ पर रेखांकित करता है क्योंकि यह बहुत सारे कोड उत्पन्न करता है।