2014-09-25 9 views
5

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

यदि मेरे पास एन तत्वों के साथ कोई नया तत्व आने के बिना बफर है, हालांकि उच्च आवृत्ति अद्यतन (जैसे कि केटी तत्व के परिवर्तन मूल्य) के साथ प्रत्येक तत्व पर एक अलग लॉक सेट करना संभव है ताकि एकमात्र समय धागे बंद हो जाएंगे और इंतजार करेंगे अगर वास्तव में 2 या अधिक धागे एक ही तत्व को अद्यतन करने का प्रयास कर रहे हैं?

+1

वह क्यों काम नहीं करेगा? – filmor

+5

आपके वास्तविक प्रश्न के शीर्षक में वर्णित "स्कॉप्ड लॉक" से कोई लेना देना नहीं है। स्कॉप्ड लॉक एक म्यूटेक्स लेते हैं और इसे लॉक करते हैं और म्यूटेक्स को अनलॉक करते हैं जब वे नष्ट होते हैं (आमतौर पर जब दायरे से बाहर निकलते हैं)। – stefaanv

+0

@stefaanv सही है। शीर्षक को कुछ और वर्णनात्मक में बदलें। –

उत्तर

7

एन mutexes के बारे में आपके प्रश्न का उत्तर देने के लिए: हाँ, यह वास्तव में संभव है। म्यूटेक्स द्वारा कौन से संसाधन सुरक्षित हैं, उस म्यूटेक्स के उपयोगकर्ता के रूप में पूरी तरह से आपके ऊपर निर्भर करता है।

इससे आपके प्रश्न का पहला (कथन) हिस्सा होता है। एक म्यूटेक्स स्वयं गारंटी नहीं देता है कि एक धागा निर्बाध काम करेगा। यह सब गारंटी देता है म्यूचुअल एक्सक्लूस - यदि थ्रेड बी एक म्यूटेक्स को लॉक करने का प्रयास करता है जो थ्रेड ए लॉक हो गया है, थ्रेड बी ब्लॉक करेगा (कोड को निष्पादित नहीं करेगा) जब तक थ्रेड ए म्यूटेक्स को अनलॉक नहीं करता है।

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

आप होने का अर्थ विज्ञान के लिए निर्णय लेते हैं, "मैं एन डेटा तत्वों की एक सरणी a और एन mutexes की एक सरणी m है, और a[i] जब m[i] लॉक किया गया है केवल किया जा सकता है तक पहुँचने," तो यह है कि यह कैसे काम करता रहेगा।

लगातार उसी प्रोटोकॉल पर चिपकने की आवश्यकता यह है कि आपको आम तौर पर म्यूटेक्स और कोड/डेटा को कक्षा में किसी अन्य तरीके से संरक्षित करना चाहिए, ताकि बाहरी कोड को विवरण जानने की आवश्यकता न हो प्रोटोकॉल का। यह सिर्फ जानता है "इस सदस्य समारोह को कॉल करें, और सिंक्रनाइज़ेशन स्वचालित रूप से होगा।" यह "automagic" कक्षा को प्रोटोकॉल को लागू करने के लिए कोर होगा।

+0

धन्यवाद। मैं वास्तव में अपने 'एलिमेंट' वर्ग में ताले लगाता हूं, हालांकि मेरे पास एक छोटा फॉलो-अप प्रश्न भी है - मान लीजिए कि मेरे पास 'बफर' है लेकिन अब सम्मिलित ऑपरेशन के छोटे मौके के साथ, और जहां तक ​​मैं समझता हूं कि मुझे लॉक करने की आवश्यकता है सम्मिलन ऑपरेशन के लिए संपूर्ण 'बफर' क्योंकि यह पूरे 'बफर' के लिए उपयोग की जाने वाली डेटा संरचना को प्रभावित करता है। लेकिन अगर मेरे पास वास्तव में एक 'अद्यतन' ऑपरेशन है, तो क्या बफर लॉक वास्तव में इसे नोटिस करेगा या इसमें रन-टाइम त्रुटि होगी? –

+2

@ कॉन्स्टेंटिन सैमोइलेंको लगता है जैसे आप प्रत्येक तत्व के लिए एक म्यूटेक्स के अलावा बफर के लिए एक पठन/लिखने का ताला उपयोग कर सकते हैं। म्यूटेक्स को लॉक करने के लिए पहले रीड लॉक प्राप्त करना होगा। सम्मिलन को लिखने के लिए लॉक प्राप्त करने की आवश्यकता होगी।इस तरह, सम्मिलन तभी हो सकता है जब कोई म्यूटेक्स लॉक न हो। – Angew

+0

शानदार! धन्यवाद। –

1

एक म्यूटेक्स अन्य धागे को पूरी तरह से चलने से नहीं रोकता है, यह केवल उसी धागे को लॉक करने से अन्य धागे को रोकता है। अर्थात। जबकि एक धागा म्यूटेक्स को बंद कर रहा है, ऑपरेटिंग सिस्टम अन्य धागे को चलाने के संदर्भ में स्विच स्विच करता रहता है, लेकिन यदि कोई अन्य थ्रेड उसी म्यूटेक्स को लॉक करने का प्रयास कर रहा है तो म्यूटेक्स अनलॉक होने तक इसका निष्पादन रोक दिया जाएगा।

तो हाँ, आप वास्तव में कई अलग-अलग म्यूटेक्स कर सकते हैं और उन्हें स्वतंत्र रूप से लॉक/अनलॉक कर सकते हैं। बस डेडलॉक्स से सावधान रहें, यानी यदि एक थ्रेड एक समय में एक से अधिक म्यूटेक्स को लॉक कर सकता है, तो आप उस स्थिति में भाग सकते हैं जहां थ्रेड 1 ने म्यूटेक्स ए को लॉक कर दिया है और म्यूटेक्स बी को लॉक करने की कोशिश कर रहा है लेकिन ब्लॉक क्योंकि थ्रेड 2 में पहले से ही म्यूटेक्स बी लॉक है और यह म्युटेक्स एक लॉक करने के लिए कोशिश कर रहा है ..

0

इसकी पूरी तरह से स्पष्ट नहीं आपके उपयोग के मामले है कि:

    धागे
  1. एक बफर पर सौंपा वे काम करने के लिए
  2. धागे कुछ परिणाम और अनुरोध किया है कि हो जाता है अद्यतन करने के लिए एक विशेष बफर।

पहले संस्करण पर आपको कुछ असाइनमेंट तर्क की आवश्यकता है जो थ्रेड को बफर निर्दिष्ट करता है। इस तर्क को परमाणु तरीके से निकाला जाना है। इसलिए असाइनमेंट लॉजिक की सुरक्षा के लिए एक म्यूटेक्स का उपयोग करना सबसे अच्छा है।

अन्य संस्करण पर यह प्रत्येक बफर तत्व के लिए म्यूटेक्स का वेक्टर होना सर्वोत्तम हो सकता है।

दोनों मामलों में बफर को सुरक्षा की आवश्यकता नहीं है क्योंकि यह (या इसके प्रत्येक क्षेत्र को बेहतर) एक समय में केवल एक थ्रेड से ही उपयोग किया जाता है।

आप स्वयं को 'सेमफोर' के बारे में भी सूचित कर सकते हैं। इनमें एक काउंटर होता है जो उन संसाधनों को प्रबंधित करने की अनुमति देता है जिनमें सीमित राशि है लेकिन एक से अधिक। म्यूटेक्स एन = 1 के साथ सेमफोर का एक विशेष मामला है।

+0

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

0

आप प्रति प्रविष्टि म्यूटेक्स कर सकते हैं, सी ++ 11 म्यूटेक्स को आसानी से अनुकूली-स्पिनलॉक में परिवर्तित किया जा सकता है, ताकि आप अच्छे सीपीयू/लेटेंसी ट्रेडऑफ प्राप्त कर सकें।

या, यदि आपको बहुत कम विलंबता की आवश्यकता है, तो अभी तक पर्याप्त CPU हैं, आप प्रति प्रविष्टि पर एक परमाणु "व्यस्त" ध्वज का उपयोग कर सकते हैं और विवाद पर एक तंग तुलना-विनिमय पाश में स्पिन कर सकते हैं।

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

4

एक म्यूटेक्स प्रति सरणी और प्रति तत्व एक म्यूटेक्स के बीच निर्णय लेने पर एक महत्वपूर्ण विचार यह है कि क्या "इन-यूज" सरणी तत्वों, "सक्रिय" तत्व, या पॉइंटर-टू-इन को स्थानांतरित करने की संख्या को ट्रैक करना है या नहीं - एक बड़े बफर के लिए ऐरे - जिसे केवल एक थ्रेड द्वारा सुरक्षित रूप से किया जा सकता है जबकि अन्य सभी अवरुद्ध होते हैं।

एक कम लेकिन कभी-कभी महत्वपूर्ण विचार अतिरिक्त स्मृति की मात्रा अधिक म्यूटेक्स का उपयोग होता है।

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

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