के विशेष उद्देश्य को ध्यान में रखते 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 का उपयोग, विंडोज :) के उपकरणों का उपयोग
अद्यतन
अपनी आवश्यकताओं के आधार पर, आप के रूप में ज्यादा आत्म करने के लिए कोशिश कर रहा द्वारा समन्वयन ऑब्जेक्ट की जरूरत को कम करने के लिए सक्षम हो सकता है एक थ्रेड में जितना संभव हो सके काम करता है और केवल अंत में या फिर डेटा को गठबंधन करता है।
बेवकूफ उदाहरण: यूआरएल की एक सूची लें। आपको उन्हें स्क्रैप करने और उनका विश्लेषण करने की आवश्यकता है।
- थ्रेड के समूह में फेंको और इनपुट सूची से, एक-एक करके यूआरएल चुनना शुरू करें। प्रत्येक प्रक्रिया के लिए आप परिणामों को केंद्रीकृत करते हैं जैसे आप करते हैं। यह वास्तविक समय और ठंडा है
- या आप इनपुट यूआरएल का टुकड़ा रखने वाले धागे में फेंक सकते हैं। यह चयन प्रक्रिया को सिंक करने की आवश्यकता को हटा देता है। आप विश्लेषण परिणाम को धागे में संग्रहीत करते हैं और अंत में, आप परिणाम को एक बार जोड़ते हैं। या सिर्फ एक बार हर 10 यूआरएल चलो कहते हैं। उनमें से प्रत्येक के लिए नहीं। यह नाटकीय रूप से सिंक संचालन को कम करेगा।
तो सही टूल चुनकर और लॉक को कम करने और अनलॉक करने के बारे में सोचकर लागत कम हो सकती है। लेकिन लागत हटाया नहीं जा सकता :)
पुनश्च: मैं केवल URL लगता है :)
अद्यतन 2:
एक परियोजना में जरूरत कुछ मापने करना था। और परिणाम काफी आश्चर्यजनक थे:
- एक
std::mutex
सबसे महंगी है। (क्रॉस-platformness की कीमत)
- एक विंडोज देशी
Mutex
2x std
से तेज है।
- एक
Critical Section
देशी Mutex
की तुलना में तेजी 2x है।
- एक
SlimReadWriteLock
Critical Section
की + -10% है।
- मेरे घर का बना
InterlockedMutex
(spinlock) 1.25x है - Critical Section
की तुलना में तेजी 1.75x।
बेशक, यदि आपके आवेदन में लगातार विवाद होता है, तो आप इस विचार पर पुनर्विचार कर सकते हैं कि म्यूटेक्स के पास बहुत अधिक उपर नहीं है। – patrickvacek