2012-07-06 18 views
6

का उपयोग करता है ग # ताला कीवर्ड एक 'उपज', 'स्पिन ताला' या संकर दृष्टिकोण का उपयोग करता है विवाद को संभालने के लिए तंत्र ताला लगा किस तरह के?ताला बयान

अभी तक .net लॉक स्टेटमेंट पर मेरी खोजों ने कोई जवाब नहीं दिया है। यदि मैं अब और पाता हूं तो मैं पोस्ट करूंगा। अब तक मुझे मिल सकता है When should one use a spinlock ... मेकी द्वारा एक अच्छी तरह से स्वीकार्य उत्तर के साथ।

लेकिन मैं कुछ निश्चित जवाब या दस्तावेज .net/सी # के बारे में अगर कोई एक है के लिए देख रहा हूँ।

उत्तर

9

के बाद कोड:

Monitor.Enter(_syncRoot) 
try 
{ 
    // Do stuff 
} 
finally 
{ 
    Monitor.Exit(_syncRoot); 
} 

यह, भोली (और पुराने) कार्यान्वयन है वास्तव में साथ .NET 4.0 कार्यान्वयन अधिक है:

lock (_syncRoot) 
{ 
    // Do stuff 
} 

को संकलक द्वारा अनुवाद किया है या इसे कम करें (पूर्ण संदर्भ के लिए Eric's blog देखें):

bool locked = false; 
try 
{ 
    Monitor.Enter(_syncRoot, ref locked); 
} 
finally 
{ 
    if (locked) 
     Monitor.Exit(_syncRoot); 
} 


कहा कि सवाल कैसे Monitor.Enter() काम करता है संपादित? ठीक है, डिफ़ॉल्ट मोनो कार्यान्वयन लॉक प्राप्त करने के लिए एक सेमफोर का उपयोग करता है लेकिन माइक्रोसॉफ्ट .NET कार्यान्वयन अलग-अलग कार्य करता है।

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

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

1
lock (obj) 
{ 
} 

Monitor के लिए बस वाक्यात्मक चीनी था। कोशिश में ... Enter ... अंत में।

Monitor.Enter(obj); 
try 
{ 
} 
finally 
{ 
    Monitor.Exit(obj); 
} 

अब यह कुछ एक little better (मुझे वर्तमान रखने के लिए मार्क और एड्रियानो के लिए धन्यवाद) है।

bool locked = false; 
try 
{ 
    Monitor.Enter(_syncRoot, ref locked); 
} 
finally 
{ 
    if (locked) 
     Monitor.Exit(_syncRoot); 
} 
+2

, ऐसा नहीं –

+0

@MarcGravell है तो मैं सिर्फ देखा है बस पिछले 10 मिनट में FAIC पढ़ने के लिए बिताया :) – DaveShaw

0

यह माइक्रोसॉफ्ट प्रलेखन कह ताला() लपेटता Monitor.Enter/बाहर निकलें

है "सी # ताला बयान है, जो दर्ज करें और में बाहर निकलें तरीकों एक कोशिश ... अंत में ब्लॉक लपेटता का उपयोग करें।"

http://msdn.microsoft.com/en-us/library/de0542zz.aspx

आप एक spinlock प्रकार आप ReaderWriterLockSlim() का उपयोग कर सकते हैं से

http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

नहीं हाल ही में संकलक संस्करणों में
+0

टिप्पणी के बिना इसे डाउनवोट क्यों करें? मैं अनुरोधित दस्तावेज को इंगित करता हूं और एक विकल्प सुझाता हूं जो वर्णित स्पिनलॉक का उपयोग करता है। – IvoTops