2010-11-01 11 views
10

मैंने थ्रेड-सुरक्षित प्रकारों और "लॉक" कथन के बारे में सभी दस्तावेज पढ़े हैं, लेकिन मुझे अभी भी 100% नहीं मिल रहा है।वास्तव में "थ्रेड-सुरक्षित प्रकार" क्या है? हमें "लॉक" कथन का उपयोग करने की आवश्यकता कब होती है?

मुझे "लॉक" कथन का उपयोग करने की ज़रूरत कब है? यह कैसे (गैर) थ्रेड-सुरक्षित प्रकार से संबंधित है? धन्यवाद।

उत्तर

12

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

संभावना यह है कि चर में मान दूषित हो जाएगा। अलग-अलग भाषाओं और कंपाइलर्स/दुभाषिया इस तरह से विभिन्न तरीकों से निपटेंगे (या बिल्कुल नहीं ...) लेकिन मुद्दा यह है कि आपको "अवांछित" और "अप्रत्याशित" परिणाम मिलते हैं।

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

आप चर पर उस लॉक को प्राप्त करने के लिए lock कथन का उपयोग करते हैं। आमतौर पर आप एक अलग वस्तु चर को परिभाषित करने और उपयोग करें कि ताला वस्तु के लिए चाहते हैं:

public class MyThreadSafeClass 
{ 
    private readonly object lockObject = new object(); 
    private string mySharedString; 

    public void ThreadSafeMethod(string newValue) 
    { 
     lock (lockObject) 
     { 
      // Once one thread has got inside this lock statement, any others will have to wait outside for their turn... 
      mySharedString = newValue; 
     } 
    } 
} 

एक प्रकार "धागा सुरक्षित" समझा जाता है अगर यह सिद्धांत लागू होता है कि कोई भ्रष्टाचार करता है, तो साझा किए गए डेटा से अधिक से पहुँचा जा सकता है हो जाएगा एक ही समय में धागे।

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

+0

तो यदि कोई प्रकार थ्रेड-सुरक्षित है, तो यह आंतरिक रूप से लॉक लागू करता है और मुझे इसे फिर से लागू नहीं करना चाहिए। क्या वह सही है? धन्यवाद नील। –

+0

हां - यदि आप किसी और के प्रकार का पुन: उपयोग कर रहे हैं (उदाहरण के लिए किसी तृतीय-पक्ष लाइब्रेरी से) और इसे "थ्रेड-सुरक्षित" के रूप में विज्ञापित किया गया है, तो आपको 'लॉक (...) {... लिखने की आवश्यकता नहीं है } 'इसके उपयोग के आसपास बयानों। हालांकि, यदि आप उस प्रकार के चर को सेट कर रहे हैं और वेरिएबल स्वयं को विभिन्न थ्रेड द्वारा संशोधित किया जा सकता है, तो आपको इसे लॉक करने की आवश्यकता है। –

7

थ्रेड सुरक्षित कोड कोड है कि कई धागे के साथ सही ढंग से पहुँचा जा सकता है और अभी भी संचालित होता है।

सी # में, यह सामान्य रूप से कुछ प्रकार की सिंक्रनाइज़ेशन तंत्र की आवश्यकता होती है। एक साधारण एक lock कथन है (जो दृश्यों के पीछे है Monitor.Enter पर कॉल)। एक कोड ब्लॉक जो lock ब्लॉक से घिरा हुआ है, केवल एक ही समय में एक थ्रेड द्वारा उपयोग किया जा सकता है।

किसी भी प्रकार का उपयोग जो थ्रेड सुरक्षित नहीं है, आपको सिंक्रनाइज़ेशन को स्वयं प्रबंधित करने की आवश्यकता होती है।


एक अच्छा सी # में सूत्रण के बारे में जानने के लिए संसाधन जो Albahari से मुक्त eBook है, here पाया।

+0

धन्यवाद ओडेड जो एक महान पढ़ा गया था और मैं अत्यधिक अनुशंसा करता हूं। –

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

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