2012-02-22 7 views
16

क्या मैं दो अलग-अलग धागे से प्राप्त दो विधियों पर एक ही लॉक ऑब्जेक्ट का उपयोग कर सकता हूं? लक्ष्य task1 और task2 थ्रेड को सुरक्षित करना है।उसी लॉक ऑब्जेक्ट का दो अलग-अलग कोड ब्लॉक पर उपयोग करें?

object lockObject = new object(); 

// Thread 1 
void Method1() 
{ 
    lock(lockObject) 
    { 
     // task1 
    } 
} 

// Thread 2 
void Method2() 
{ 
    lock(lockObject) 
    { 
     // task2 
    } 
} 

उत्तर

19

हां, आप उसी लॉक ऑब्जेक्ट का उपयोग कर सकते हैं (यह तकनीकी रूप से monitor कंप्यूटर विज्ञान अर्थ में है, और दो अलग-अलग तरीकों से System.Monitor में विधियों के लिए कॉल के साथ लागू किया गया है)।

तो, कहें कि आपके पास कुछ स्थिर संसाधन r था, और आप उस संसाधन तक पहुंचने के लिए दो थ्रेड चाहते थे, लेकिन एक ही समय में केवल एक थ्रेड इसका उपयोग कर सकता है (यह लॉक का क्लासिक लक्ष्य है)। तो फिर तुम,

public class Foo 
{ 
    private static object _LOCK = new object(); 

    public void Method1() 
    { 
     lock (_LOCK) 
     { 
      // Use resource r 
     } 
    } 

    public void Method2() 
    { 
     lock (_LOCK) 
     { 
      // Use resource r 
     } 
    } 
} 

आप अपने कार्यक्रम में r के हर उपयोग के आसपास लॉक करने की आवश्यकता की तरह कोड लिखने के बाद से अन्यथा दो धागे एक ही समय में r का उपयोग कर सकते हैं। इसके अलावा, आपको एक ही लॉक का उपयोग करना होगा, क्योंकि अन्यथा दो धागे एक ही समय में r का उपयोग करने में सक्षम होंगे। इसलिए, यदि आप दो अलग-अलग तरीकों से r का उपयोग कर रहे हैं, तो आप दोनों विधियों से एक ही लॉक का उपयोग करना चाहिए।

संपादित करें: @diev टिप्पणी में बताते हैं के रूप में, यदि संसाधन प्रकार Foo की वस्तुओं पर प्रति-उदाहरण थे, हम _LOCK स्थिर नहीं होगा, लेकिन _LOCK उदाहरण स्तर के डेटा होगा।

+0

+1 "उपयोग" को ढूंढने के लिए +1! –

+0

मेरा बुरा। मैं लॉक कहना चाहता था (lockObject) – RedFox

+1

आपको स्पष्ट रूप से इस तथ्य को कॉल करना चाहिए कि लॉक ऑब्जेक्ट 'स्थैतिक' है, और इस प्रकार संसाधन जो इसे संरक्षित कर रहा है वह भी 'स्थिर' होना चाहिए; यदि आर उदाहरण के स्तर पर संसाधन उपलब्ध था, तो एक उदाहरण स्तर लॉक ऑब्जेक्ट शायद बेहतर काम करेगा। – dlev

5

आप एक ही समय में task1 और task2 प्रदर्शन से अलग धागे को रोकने के लिए चाहते हैं, तो आप एक ही ताला वस्तु का उपयोग करना चाहिए।

यदि दो कार्य समान संसाधनों के लिए संघर्ष नहीं करते हैं, तो आप विभिन्न लॉक ऑब्जेक्ट्स का उपयोग कर सकते हैं।

4

हां।

आप कर सकते हैं और यह काम करता है। यदि आप एक ही ऑब्जेक्ट का उपयोग नहीं करते हैं, तो ब्लॉक एक ही समय में निष्पादित हो सकते हैं। यदि आप एक ही वस्तु का उपयोग करते हैं, तो वे नहीं कर सकते हैं।

इसके अलावा, आपका मतलब lock(lockObject) है, using(lockObject) नहीं।

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

  • कोई संबंधित समस्या नहीं^_^