यह प्रश्न दौड़-परिस्थितियों, परमाणुता के बारे में, या आपको अपने कोड में ताले का उपयोग क्यों करना चाहिए। मैं पहले से ही उन लोगों के बारे में जानता हूँ।क्या सी # थ्रेड वास्तव में एक मूल्य कैश कर सकता है और अन्य धागे पर उस मान में परिवर्तनों को अनदेखा कर सकता है?
अद्यतन: मेरा प्रश्न "अस्थिर स्मृति के साथ अजीबता नहीं है" (मुझे पता है कि यह करता है), मेरा सवाल है ".NET रनटाइम सार नहीं है जो आप इसे कभी नहीं देख पाएंगे"।
http://www.yoda.arachsys.com/csharp/threads/volatility.shtml और Is a string property itself threadsafe?
पर पहले उत्तर देखें (वे वास्तव में एक ही लेख एक अन्य संदर्भ के बाद से कर रहे हैं।) एक धागा एक bool और अन्य धागा सेट लूप हमेशा के लिए है कि bool पढ़ने - उन लेखों दावा करें कि रीडिंग थ्रेड पुराने मान को कैश कर सकता है और कभी भी नया मान नहीं पढ़ सकता है, इसलिए आपको लॉक की आवश्यकता है (या अस्थिर कीवर्ड का उपयोग करें)। वे दावा करते हैं कि निम्नलिखित कोड संभावित रूप से लूप हमेशा के लिए होगा। अब मैं मानता हूं कि यह आपके चर को लॉक करने का अच्छा अभ्यास है, लेकिन मुझे विश्वास नहीं है कि .NET रनटाइम वास्तव में लेख के दावों के रूप में बदल रहे स्मृति मान को अनदेखा कर देगा। मैं अस्थिर स्मृति बनाम अस्थिर स्मृति के बारे में उनकी बात समझता हूं, और मैं मानता हूं कि उनके पास गैर-प्रबंधित कोड में एक वैध बिंदु है, लेकिन मुझे विश्वास नहीं है कि .NET रनटाइम सही ढंग से उस सार को सही ढंग से सार नहीं देगा जिससे कि निम्नलिखित कोड जो आप उम्मीद करते हैं। लेख यह भी मानता है कि कोड "लगभग निश्चित रूप से" काम करेगा (हालांकि गारंटी नहीं है), इसलिए मैं दावा पर बीएस को बुला रहा हूं। क्या कोई यह सत्यापित कर सकता है कि यह सच है कि निम्न कोड हमेशा काम नहीं करेगा? क्या कोई भी एक मामला पाने में सक्षम है (शायद आप इसे हमेशा पुन: उत्पन्न नहीं कर सकते) जहां यह विफल रहता है?
class BackgroundTaskDemo
{
private bool stopping = false;
static void Main()
{
BackgroundTaskDemo demo = new BackgroundTaskDemo();
new Thread(demo.DoWork).Start();
Thread.Sleep(5000);
demo.stopping = true;
}
static void DoWork()
{
while (!stopping)
{
// Do something here
}
}
}
मैं मानता हूं कि ऐसा लगता है कि यह हमेशा काम करना चाहिए। शायद पीईएक्स इसे तोड़ने का एक तरीका ढूंढ सकता है। –
वह संकलित भी नहीं करेगा; उदाहरण शायद समस्या-क्षेत्र के करीब है यदि आप सबकुछ स्थिर बनाते हैं (अन्यथा भरोसा अनुकूलन को रोक सकता है, * यदि * जेआईटी करता है)। –
कामकाजी काउंटर उदाहरण के साथ अद्यतन ;-p –