2010-01-04 14 views
11

Threadsafe एक शब्द है जो दस्तावेज़ीकरण के आसपास फेंक दिया जाता है, हालांकि इसका अर्थ शायद ही कभी एक ऐसी भाषा में है जो पहली बार थ्रेडिंग सीखने के लिए समझ में आता है।थ्रेडसेफ को कैसे परिभाषित किया जाए?

तो आप Threadsafe कोड को किसी नए थ्रेडिंग के लिए कैसे समझाते हैं? विकल्प के लिए मेरे विचारों पल रहे हैं:

  • आप क्या बनाम धागा असुरक्षित कोड धागा सुरक्षित बनाता है की एक सूची का उपयोग करते हैं
  • पुस्तक परिभाषा
  • एक उपयोगी रूपक
+0

समुदाय विकी? – Adrian

उत्तर

12

Eric Lippert says:

जब मैंने पूछा रहा हूँ "इस कोड धागा सुरक्षित है?" मुझे हमेशा वापस धक्का देना पड़ता है और पूछता है कि "सटीक थ्रेडिंग परिदृश्य क्या हैं जिनके बारे में आप चिंतित हैं?" और "उन परिदृश्यों में से प्रत्येक में ऑब्जेक्ट का सही व्यवहार क्या है?"।

यह कहने में नामुमकिन है कि कोड "थ्रेड सुरक्षित" किसी भी तरह से संचारित थ्रेड सुरक्षा तंत्र का अवांछित व्यवहार क्या करता है और इससे नहीं रोकता है।

3

G'day,

शुरू करने के लिए एक अच्छी जगह POSIX paper on thread safety के पढ़ने के लिए है।

संपादित करें: केवल पहले कुछ पैराग्राफ आपको थ्रेड सुरक्षा और पुन: प्रवेश कोड का त्वरित अवलोकन देते हैं।

HTH

चियर्स,

2

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

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

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

+0

वास्तव में अच्छा उदाहरण –

0

ट्रेड-सुरक्षित कोड कोड है जो विफल नहीं होगा क्योंकि एक ही समय में दो स्थानों में एक ही डेटा बदल दिया गया था। थ्रेड सुरक्षित समेकन-सुरक्षित की तुलना में एक छोटी अवधारणा है, क्योंकि यह मानता है कि यह वास्तव में हार्डवेयर मोडिंग डेटा या ओएस के बजाए एक ही प्रोग्राम के दो धागे थे।

0

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

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

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

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

+0

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

+0

... जब यह प्रवेश करता है, और इसे बाहर निकलने पर पुनर्स्थापित करता है। ऐसे परिदृश्यों में जो वैश्विक स्थिति का उपयोग करते हैं, यह पैटर्न कई लाइव राज्यों और उनके बीच स्विच करने की क्षमता के मुकाबले काम करना अधिक आसान हो सकता है। हालांकि, यह बहु-कार्य करने वाले प्रकारों पर कुछ प्रतिबंध लगा सकता है जो कोई कर सकता है। – supercat

14

मल्टीथ्रेडिंग गैर-निर्धारिती निष्पादन की ओर जाता है - आपको बिल्कुल पता नहीं है कि समांतर कोड का एक निश्चित भाग कब चलाया जाता है।

यह देखते हुए कि, इस अद्भुत multithreading tutorial को परिभाषित करता है धागा सुरक्षा इस तरह:

थ्रेड-सुरक्षित कोड कोड है जो किसी भी बहु सूत्रण परिदृश्य का सामना करने में कोई अनिश्चितता नहीं है। थ्रेड-सुरक्षा प्राथमिक रूप से लॉकिंग के साथ हासिल की जाती है, और धागे के बीच बातचीत के लिए संभावनाओं को कम करके।

यह नियम नहीं बदलेगा धागे विशेष रूप से चलाए जा रहे हैं इसका मतलब है, व्यवहार हमेशा अच्छी तरह से परिभाषित (और इसलिए race conditions से मुक्त) है।

3

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

+0

केवल आंशिक रूप से सच है क्योंकि आपको केवल उन ग्लोबल वैरिएबल को म्यूटेक्स के साथ सुरक्षित रखना है, उदाहरण के लिए थ्रेड सुरक्षित फ़ंक्शन – claf

+0

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

1

मैं थ्रेड सुरक्षित समझने के लिए कहूंगा, थ्रेड सुरक्षित फ़ंक्शन और पुनर्वित्त समारोह के बीच अंतर को समझने के साथ शुरू करें।

विवरण के लिए कृपया The difference between thread-safety and re-entrancy देखें।

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