2012-03-20 16 views
5

मान लें कि मेरे पास स्थिर विधि वाला स्थिर वर्ग है।स्टेटिक क्लास के साथ रेस कंडीशन?

एकाधिक धागे इस स्थिर विधि को समवर्ती रूप से कॉल कर सकते हैं।

वहाँ इन परिस्थितियों में एक रेस स्थिति के लिए एक संभावित है:

a - if the method depends only on local variables 
b - if the method depends on local variables and member fields 
+0

कृपया अधिक जानकारी प्रदान करने के लिए कुछ छद्म कोड या नमूने प्रदान करने के लिए अपना प्रश्न संपादित करें। धन्यवाद। – Gray

+0

इनमें से कोई भी कोई प्रभाव नहीं है या दूसरा। एकमात्र चीज जो मायने रखती है वह यह है कि क्या एकाधिक धागे एक ही वस्तु का उपयोग करते हैं। –

+0

प्रत्येक विधि कॉल में स्थानीय चर की अपनी प्रति है, इसलिए मुझे 99% यकीन है कि केवल स्थानीय चर का उपयोग करने से दौड़ की स्थिति नहीं बन जाएगी। हालांकि, सदस्य फ़ील्ड का उपयोग करना होगा। – aboveyou00

उत्तर

21

मान लें कि मेरे पास स्थिर विधि वाला एक स्थिर वर्ग है। एकाधिक धागे इस स्थिर विधि को समवर्ती रूप से कॉल कर सकते हैं।

ठीक है। एक - विधि केवल स्थानीय चर

हाँ, वहाँ संभावित हैं प्रकार स्थितियां पर निर्भर करता है:

वहाँ इन परिस्थितियों में एक रेस स्थिति के लिए एक संभावित है।

ख - विधि स्थानीय चर और सदस्य क्षेत्रों

हाँ, वहाँ संभावित हैं प्रकार स्थितियां पर निर्भर करता है।

के जवाब (क) और (ख) कर रहे हैं एक और अधिक सामान्य नियम का एक परिणाम है, अर्थात्, वहाँ हमेशा दौड़ की स्थिति किसी भी बार जब आप फोन से अधिक थ्रेड से किसी भी विधि के लिए क्षमता।उदाहरण के लिए, इस कार्यक्रम के गतिरोध:

class MyClass 
{ 
    static MyClass() 
    { 
    // Let's run the initialization on another thread! 
    var thread = new System.Threading.Thread(Initialize); 
    thread.Start(); 
    thread.Join(); 
    } 

    static void Initialize() 
    { } 

    static void Main() 
    { } 
} 

यह कोई क्षेत्रों, दो तरीकों कि कुछ नहीं करते हैं, और एक भी स्थानीय चर कि केवल एक ही धागे पर पहुँचा जा सकता है है। और फिर भी, यह तुरंत और लगातार deadlocks। (क्या आप देखते हैं? इस कार्यक्रम पर और अधिक के लिए http://ericlippert.com/2013/01/31/the-no-lock-deadlock/ देखें।)

ऐसा लगता है कि आप गारंटी चाहते हैं कि आपका प्रोग्राम थ्रेडसेफ है यदि आपकी स्थिर विधियां फ़ील्ड तक नहीं पहुंचती हैं। ऐसी कोई गारंटी नहीं है। आपका प्रोग्राम थ्रेडसेफ है और केवल अगर आप इसे थ्रेडसेफ लिखते हैं।

+0

क्या कुछ बदलता है जब: 'प्रारंभ करें' गैर स्थैतिक और 'थ्रेड (नया MyClass() प्रारंभ करें) '? या 'थ्रेड ((MethodInvoker) प्रतिनिधि {नया MyClass()। प्रारंभ करें();}) '? –

+0

मुझे बिल्कुल यकीन नहीं है कि यह उदाहरण ओपी की समस्या फ्रेम में फिट बैठता है। मैं इस धारणा के तहत था कि वह एक बाहरी विधि को स्पष्ट रूप से कई बाहरी धागे द्वारा बुलाया जा रहा था। – Tudor

+1

@BenVoigt: विचित्र रूप से पर्याप्त, नहीं। रनटाइम यह देखने के लिए जांच करता है कि प्रारंभिक विधि जरूरी होने पर स्थैतिक सीटीआर चलाया जाता है, भले ही यह एक स्थैतिक या उदाहरण विधि हो। अब आप कह सकते हैं, लेकिन उदाहरण प्रारंभिक विधि को तब तक नहीं बुलाया जा सकता जब तक कि पहले से ही कोई उदाहरण नहीं बनाया गया हो, जिस स्थिति में निर्माता ने थ्रेड को स्थिर कन्स्ट्रक्टर कहा है। लेकिन (1) जैसा कि हमने देखा है, स्थैतिक कन्स्ट्रक्टर अभी तक नहीं किया जा सकता है, और (2) क्या होगा यदि "यह" शून्य है? उस स्थिति में शायद एक उदाहरण बनाया गया हो सकता है। –

5

सबसे पहले, एक विधि बस एक पते पर रहने वाले कोड का एक टुकड़ा है। एक विधि को बुलाए जाने वाले प्रत्येक थ्रेड में उस विधि की प्रतिलिपि होगी और इसके स्थानीय चर अपने निजी ढेर पर होंगे। तो अगर किसी के मामले में, कोई अन्य कैच नहीं है, यह थ्रेड-सुरक्षित होना चाहिए।

  • आप वास्तव में उन सदस्य चर तक पहुँच रहे हैं:

    केस ख कारकों में से एक बहुत पर निर्भर करता है?

  • आप उन्हें कैसे एक्सेस कर रहे हैं: केवल पढ़ता है, पढ़ता है + लिखता है, आदि
  • किस तरह के सदस्य चर: डेटा संरचनाएं, एकल मान।
  • क्या आपके पास कोई सिंक्रनाइज़ेशन है?
  • आदि

आम तौर पर हालांकि, आप वर्ग के सदस्यों का उपयोग कर यह सोचते हैं, यह नहीं धागा सुरक्षित माना जाना चाहिए।

3

ए - नहीं। रेस स्थितियां केवल तब होती हैं जब स्थैतिक विधियां किसी साझा संसाधन तक पहुंचने का प्रयास कर रही हैं। स्थानीय चर विधि को बुलाए प्रत्येक थ्रेड के लिए अद्वितीय होगा।

बी - हां। उन स्थिर सदस्यों को उस विधि को बुलाए गए सभी धागे द्वारा साझा किया जाएगा।

+0

स्थानीय चर अद्वितीय होगा, लेकिन इसके बारे में क्या ऑब्जेक्ट यह संदर्भित करता है? यह साझा किया जा सकता है। – svick

+0

@ एसविक मैं मान रहा हूं कि "स्थानीय चर" द्वारा ओपी का अर्थ यह नहीं है कि विधि, या वैश्विक चर में पारित किया गया था। दूसरे शब्दों में, स्थानीय चर वे ऑब्जेक्ट्स हैं जो विधि के भीतर बनाए और मर जाएंगे। –

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