2012-06-12 9 views
7

Monitor.Enter और Monitor.Exit को उसी थ्रेड से कॉल करने के लिए डिज़ाइन किया गया है। लेकिन, अगर मुझे अधिग्रहण से अलग थ्रेड में लॉक जारी करने की आवश्यकता है तो क्या होगा?मॉनिटर। एंटर और मॉनिटर। विभिन्न धागे

उदाहरण के लिए: साझा संसाधन और एसिंक्रोनस ऑपरेशन है जो इस संसाधन का उपयोग करता है। ऑपरेशन BeginOperation से शुरू होता है और साझा संसाधन पर लॉक प्राप्त करता है। EndOperation विधि भी लॉक जारी करती है। EndOperation को आमतौर पर कॉलबैक से दूसरे धागे में बुलाया जाता है, इस प्रकार मैं EndOperation विधि में Monitor.Exit पर कॉल नहीं कर सकता। इस मामले में सबसे अच्छा तरीका क्या है? Monitor के बजाय AutoResetEvent के साथ लॉकिंग को दोबारा जांचना अच्छा समाधान होगा?

+4

"सेमफोर" का उपयोग करें? –

+0

@pst क्यों विशेष रूप से 'सेमफोर' और 'ईवेंट' नहीं? – eigenein

+0

सिंक्रनाइज़ेशन प्राइमेटिव्स जैसे [सेमफोर, सेमफोरस्लिम, रीडरवाइटर लॉक, रीडरवाइटर लॉकस्लिम, मैनुअल रीसेट, मैनुअल रीसेट इवेंटस्लिम, ऑटो रीसेट, काउंटरडाउन, इंटरलॉक, म्यूटेक्स इत्यादि] देखें। (Http://msdn.microsoft.com/en-us/library/system.threading.aspx) –

उत्तर

4

मैन्युअल रीसेट इवेंट का उपयोग करने का प्रयास करें, इसका उपयोग कुछ बाहरी घटनाओं को ट्रिगर होने तक थैड को अवरुद्ध करने के लिए किया जाता है। एमएसडीएन डॉक्टर:

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

7

यदि आप .NET 4.0 का उपयोग कर सकते हैं तो आप इसे System.Threading.Semaphore से प्रतिस्थापित कर सकते हैं जो आपको एक थ्रेड में परमिट प्राप्त करने और उन्हें दूसरे में रिलीज़ करने की अनुमति देता है।

सेमफोर क्लास प्रतीक्षाऑन या रिलीज पर कॉल पर थ्रेड पहचान लागू नहीं करता है।

11

जो प्राइमेट आप खोज रहे हैं उसे semaphore कहा जाता है जिसे सुरक्षित रूप से एक थ्रेड पर दर्ज किया जा सकता है और दूसरे से बाहर निकला जा सकता है।