'टॉगल()' कक्षा थ्रेडसेफ में 'इंस्टेंस' के माध्यम से पहुंच है? यदि हां, किस धारणाओं, नियमों, आदि से। यदि नहीं, तो मैं इसे कैसे और कैसे ठीक कर सकता हूं?
नहीं, यह threadsafe नहीं है।
असल में, दोनों धागे एक ही समय में Toggle
समारोह चला सकते हैं, तो यह
// thread 1 is running this code
if(value == 0)
{
value = 1;
// RIGHT NOW, thread 2 steps in.
// It sees value as 1, so runs the other branch, and changes it to 0
// This causes your method to return 0 even though you actually want 1
}
else if(value == 1)
{
value = 0;
}
return value;
आप नीचे दिए गए इस धारणा के साथ काम करने की जरूरत है हो सकता है।
यदि 2 धागे चल रहे हैं, तो वे किसी भी बिंदु पर यादृच्छिक रूप से एक दूसरे के साथ बातचीत कर सकते हैं और बातचीत कर सकते हैं। आप 64 बिट पूर्णांक या फ्लोट (32 बिट सीपीयू पर) लिखने या पढ़ने के माध्यम से आधा रास्ता हो सकते हैं और दूसरा धागा कूद सकता है और इसे नीचे से बदल सकता है।
यदि 2 धागे कभी भी सामान्य में कुछ भी नहीं पहुंचते हैं, तो इससे कोई फर्क नहीं पड़ता, लेकिन जैसे ही वे करते हैं, आपको उन्हें एक दूसरे के पैर की उंगलियों पर कदम उठाने से रोकने की आवश्यकता होती है। .NET में ऐसा करने का तरीका ताले के साथ है।
आप क्या और कहाँ इस तरह चीजों के बारे में सोच को लॉक करते हैं तय कर सकते हैं:
कोड का एक दिए गए ब्लॉक के लिए, यदि something
का मूल्य मुझे नीचे से बाहर बदल गया, इससे कोई फर्क होगा? यदि ऐसा होगा, तो आपको उस कोड की अवधि के लिए उस something
को लॉक करने की आवश्यकता होगी जहां यह महत्वपूर्ण होगा।
अपने उदाहरण को देखते फिर
// we read value here
if(value == 0)
{
value = 1;
}
else if(value == 1)
{
value = 0;
}
// and we return it here
return value;
इस के लिए आदेश वापस जाने के लिए क्या हम यह करने की उम्मीद में, हम मानते हैं कि value
पढ़ने और return
के बीच बदल जाओ नहीं होंगे। वास्तव में सही होने के लिए इस धारणा के लिए, आपको उस कोड ब्लॉक की अवधि के लिए value
लॉक करने की आवश्यकता है। नेट आप केवल ताला संदर्भ प्रकार कर सकते हैं में
lock(value)
{
if(value == 0)
... // all your code here
return value;
}
हालांकि
:
तो आप ऐसा करते हैं चाहते हैं। Int32 एक वैल्यू टाइप है, इसलिए हम इसे लॉक नहीं कर सकते हैं।
हम इसे 'डमी' ऑब्जेक्ट पेश करके और लॉक करते हुए लॉक करते हैं, जहां भी हम 'मान' लॉक करना चाहते हैं।
यह Ben Scheirman का जिक्र है।
क्या इसे वास्तव में सिंगलटन होने के लिए निजी सीटीओ की आवश्यकता है? –