के बाद कोड:
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
और विंडोज क्रिटिकल सेक्शन दोनों एक छोटी कताई करते हैं। इस एल्गोरिदम को "दो-चरण लॉकिंग प्रोटोकॉल" कहा जाता है और यह उचित है क्योंकि संदर्भ स्विच और कर्नेल संक्रमण बहुत विस्तृत हैं, मल्टीप्रोसेसर मशीन कताई पर दोनों से बच सकते हैं।
इसके अलावा यह भूलें कि ये कार्यान्वयन विवरण हैं और किसी भी रिलीज में बदल सकते हैं (या एएलगोरिदम जेआईटी कंपाइलर के कारण विभिन्न हार्डवेयर के लिए अलग हो सकता है)।
स्रोत
2012-07-06 12:12:43
, ऐसा नहीं –
@MarcGravell है तो मैं सिर्फ देखा है बस पिछले 10 मिनट में FAIC पढ़ने के लिए बिताया :) – DaveShaw