2010-10-20 21 views
16

मैं मल्टीथ्रेडिंग और साझा संसाधनों के उपयोग पर पढ़ रहा हूं और कई में से एक (मेरे लिए) नई अवधारणाएं म्यूटेक्स लॉक है। मुझे यह पता लगाना प्रतीत नहीं होता कि वास्तव में धागे के साथ क्या हो रहा है जो "महत्वपूर्ण खंड" को बंद कर देता है। यह कई स्थानों पर कहता है कि थ्रेड "अवरुद्ध" हो जाता है, लेकिन इसका क्या अर्थ है? क्या इसे निलंबित कर दिया गया है, और लॉक उठाए जाने पर फिर से शुरू होगा? या फिर "रन लूप" के अगले पुनरावृत्ति में फिर से प्रयास करेंगे?म्यूटेक्स लॉक: "अवरुद्ध" का अर्थ क्या है?

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

उत्तर

11

अवरुद्ध मतलब है कि निष्पादन वहां फंस गया है; आम तौर पर, धागे को सिस्टम द्वारा सोया जाता है और प्रोसेसर को दूसरे धागे में पैदा करता है। जब एक थ्रेड को म्यूटेक्स प्राप्त करने की कोशिश कर अवरुद्ध किया जाता है, तो म्यूटेक्स जारी होने पर निष्पादन फिर से शुरू होता है, हालांकि थ्रेड फिर से ब्लॉक हो सकता है यदि कोई अन्य थ्रेड म्यूटेक्स को पकड़ने से पहले पकड़ लेता है।

आम तौर पर एक प्रयास-लॉक ऑपरेशन होता है जो संभव होने पर म्यूटेक्स को पकड़ लेता है, और यदि नहीं, तो एक त्रुटि वापस आ जाएगी। लेकिन आपको अंततः उस कतार में वर्तमान घटना को स्थानांतरित करना होगा। साथ ही, यदि आप घटनाओं को उस थ्रेड पर ले जाने में देरी करते हैं जहां उन्हें संभाला जाता है, तो आवेदन परवाह किए बिना उत्तरदायी नहीं होगा।

एक कतार वास्तव में एक मामला है जहां आप म्यूटेक्स का उपयोग न करने से दूर हो सकते हैं। उदाहरण के लिए, मैक ओएस एक्स (और संभवतः आईओएस) OSAtomicEnqueue() और OSAtomicDequeue() फ़ंक्शंस (man atomic या <libkern/OSAtomic.h> देखें) प्रदान करता है जो लॉक का उपयोग करने से बचने के लिए प्रोसेसर-विशिष्ट परमाणु संचालन का शोषण करता है।

लेकिन, मुख्य रन लूप के हिस्से के रूप में मुख्य धागे पर ईवेंट को क्यों न केवल संसाधित करें?

+0

मुख्य रन लूप एप्लिकेशन को ड्राइव नहीं करता है। मैं मैक ओएसएक्स पर हूं और एक सीवीडिस्प्ले लिंक का उपयोग करता हूं जो प्रभावी रूप से एक अलग (उच्च प्राथमिकता) धागा उत्पन्न कर रहा है जो बदले में मेरे रन लूप को चलाएगा। घटनाक्रम, जैसा कि मैं इसे समझता हूं, मुख्य धागे पर वितरित किया जाएगा, इसलिए सिंक्रनाइज़ेशन क्रम में लगता है। – zmippie

1

अवरुद्ध करने का मतलब बस यही है। यह अवरुद्ध है। यह सक्षम होने तक आगे नहीं बढ़ेगा। आप यह नहीं कहते कि आप किस भाषा का उपयोग कर रहे हैं, लेकिन अधिकांश भाषाओं/पुस्तकालयों में लॉक ऑब्जेक्ट्स हैं जहां आप लॉक लेने के लिए "प्रयास" कर सकते हैं और फिर सफल होने के बाद या नहीं, इस पर निर्भर करते हुए कुछ अलग करते हैं।

लेकिन उदाहरण के लिए, जावा सिंक्रनाइज़ किए गए ब्लॉक, आपका धागा तब तक रुक जाएगा जब तक यह मॉनीटर (म्यूटेक्स, लॉक) प्राप्त करने में सक्षम न हो। java.util.concurrent.locks.Lock इंटरफ़ेस लॉक ऑब्जेक्ट्स का वर्णन करता है जिनमें लॉक अधिग्रहण के मामले में अधिक लचीलापन है।

6

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

+0

तो अवरुद्ध या प्रतीक्षा करने में क्या अंतर है, क्या वे वही बात हैं? – Celeritas

0

उत्तर देने में बहुत देर हो चुकी है लेकिन मैं समझ को सुविधाजनक बना सकता हूं। मैं सैद्धांतिक ग्रंथों के बजाय कार्यान्वयन परिप्रेक्ष्य से अधिक बात कर रहा हूं।

शब्द "अवरुद्ध" तकनीकी नाम का प्रकार है।लोग इसका उपयोग या केवल के लिए कर सकते हैं। इस शब्द को उपयोग के संदर्भ में समझा जाना चाहिए।

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

को अवरुद्ध करने का मतलब है सो रही है - धागा बजाय पढ़ने की तरह सिस्टम कॉल कर दिया था, तो() नेटवर्क सॉकेट से इंतजार कर डेटा, यह जब तक यह यह हो जाता है आगे नहीं बढ़ सकते। इसलिए, कुछ ग्रंथों ने आकस्मिक रूप से शब्द अवरुद्ध करने का उपयोग किया है ... "I/O के लिए अवरुद्ध" या "... सिस्टम कॉल अवरुद्ध करने में"। असल में, थ्रेड बी बल्कि सो रहा है। नींद कतार के रूप में जाना जाने वाला विशिष्ट डेटा-स्ट्रक्चर हैं - एयर-पोर्ट्स पर लक्जरी प्रतीक्षा कक्षों की तरह :-)। जब ओएस डेटा की उपलब्धता का पता लगाता है, तो थ्रेड को जागृत किया जाएगा, जो प्रतीक्षा कक्ष के एक कर्मचारी की तरह है।

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