2013-01-17 7 views
7

मेरे पास निम्न स्थितियां है: मैं किसी ऑब्जेक्ट तक पहुंच को पार करना चाहता हूं।सुरक्षित रूप से उसी ऑब्जेक्ट पर लॉक और मॉनिटर किया जा सकता है?

अब तक मैं normaly एक ताला वस्तु

object lockObject = new object(); 
... 

method1: lock(lockObject) { CODE1 } 

का प्रयोग करेंगे अब मैं भी एक तरीका है जिसके एक और धागे से कहा जा सकता है की है। इसे अज्ञात समय के लिए अवरुद्ध नहीं किया जाना चाहिए, इसके बजाय इसे एक निर्धारित समय में जवाब देना चाहिए।

इस मामले में मैं एक मॉनिटर का प्रयोग करेंगे,

method2: 
try{ 
    Monitor.TryEnter(lockObject , 20000, ref lockTaken); 
    if (lockTaken) {CODE2} 
} 
catch(...){...} 
finally 
{ 
    if (lockTaken) Monitor.Exit(timerLock); 
} 

अब की तरह मेरे सवाल यह है: लॉक कर सकते हैं और मॉनिटर इस तरह से मिलाया जा अगर lockobject एक ही है और परस्पर एक दूसरे को बाहर, या होगा प्रत्येक लॉक को मॉनिटर में बदलने की आवश्यकता होनी चाहिए।

तो क्या दोनों बार एक ही टोकन "लॉक" हो जाएगा, या मॉनीटर ऑब्जेक्ट के लिए एक और टोकन बना देगा तो लॉक?

एक झलक में मैं नहीं देख सकता कि अनुप्रयोग एक ही समय में दोनों के कोड में चलता है। लेकिन मुझे नहीं पता कि क्या कोई समय मुद्दा मौजूद हो सकता है, जहां सीओडीई 1 और सीओडीई 2 समानांतर में निष्पादित किए जाते हैं।

+1

मुझे तुम्हारा दर्द महसूस होता है; मैं अक्सर चाहता हूं कि 'लॉक' कीवर्ड ने किसी भी समय –

उत्तर

6
lock (sync) 
{ 
    return World(); 
} 

इंटरमीडिएट भाषा में इसकी लाइनों के साथ देखेंगे।

L_0007: call void [mscorlib]System.Threading.Monitor::Enter(object) 
L_000c: call int32 Hello::World() 
L_0011: stloc.0 
L_0012: leave.s L_001b 
L_0014: ldloc.1 
L_0015: call void [mscorlib]System.Threading.Monitor::Exit(object) 

तो यह ठीक होना चाहिए। वे तकनीकी रूप से समकक्ष हैं।

+0

ध्यान दें कि .NET 4 या ऊपर लक्षित करते समय सीएससी के हाल के संस्करणों में इस –

+0

पर अलग-अलग आईएल होंगे, धन्यवाद। किसी न किसी उदाहरण के लिए बस यह किया। –

5

लॉक कर सकते हैं और अगर lockobject ही है इस तरह से मिलाया जा नजर रखने और परस्पर एक दूसरे को बाहर निकालने के

हाँ, कि पूरी तरह से सुरक्षित है और यह काम करेंगे।

lock { } कथन मॉनिटर को कॉल करने के लिए फिर से लिखा गया है। एंटर() और मॉनिटर.एक्सिट()। यह सिर्फ छोटा हाथ है, using() {} कथन के समान ही है।

MSDN से:

lock (x) ... 

हो जाता है

System.Threading.Monitor.Enter(x); 
try { 
    ... 
} 
finally { 
    System.Threading.Monitor.Exit(x); 
} 

और टिप्पणी के अनुसार, FX4 में और बाद में इसे Monitor.TryEnter() उपयोग कर सकते हैं। लेकिन उपरोक्त सरल संस्करण आपके प्रश्न का उत्तर देता है।

+2

या मॉनीटर किया है। .NET 4+ को लक्षित करते समय प्रयास करें। –

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

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