यहाँ इस व्यवहार की सामूहिक समझ के लिए मेरा योगदान है ... यह ज्यादा नहीं है, बस एक प्रदर्शन (xkip के डेमो पर आधारित) जो एक अस्थिर छंद के व्यवहार को एक गैर-वाष्पशील (यानी "सामान्य") अंतर मूल्य, पक्ष द्वारा दिखाता है -बस, उसी कार्यक्रम में ... जो मुझे यह धागा मिल रहा था, वह मैं देख रहा था।
using System;
using System.Threading;
namespace VolatileTest
{
class VolatileTest
{
private volatile int _volatileInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _volatileInt = 1; }).Start();
while ( _volatileInt != 1 )
;
Console.WriteLine("_volatileInt="+_volatileInt);
}
}
class NormalTest
{
private int _normalInt;
public void Run() {
new Thread(delegate() { Thread.Sleep(500); _normalInt = 1; }).Start();
while ( _normalInt != 1 )
;
Console.WriteLine("_normalInt="+_normalInt);
}
}
class Program
{
static void Main() {
#if DEBUG
Console.WriteLine("You must run this program in Release mode to reproduce the problem!");
#endif
new VolatileTest().Run();
Console.WriteLine("This program will now hang!");
new NormalTest().Run();
}
}
}
ऊपर कुछ वास्तव में उत्कृष्ट संक्षिप्त व्याख्याएं हैं, साथ ही साथ कुछ महान संदर्भ भी हैं। मेरी मदद करने के लिए सभी के लिए धन्यवाद मेरे सिर के चारों ओर volatile
(कम से कम यह जानने के लिए कि volatile
मेरी पहली वृत्ति कहां थी पर भरोसा नहीं करना चाहिएlock
चाहिए)।
चीयर्स, और सभी मछली के लिए धन्यवाद। कीथ।
पुनश्च: मुझे मूल अनुरोध के डेमो में बहुत दिलचस्पी होगी, जो था: "मैं एक स्थिर वाष्पशील इंट को देखना चाहूंगा जहां एक स्थिर व्यवहार हो इंट दुर्व्यवहार करता है।
मैंने इस चुनौती को आजमाया और विफल रहा। (वास्तव में मैं बहुत जल्दी छोड़ दिया; ;-) सब कुछ में मैंने स्टैटिक वर्जन के साथ कोशिश की थी कि वे "सही ढंग से व्यवहार करें" चाहे वे अस्थिर हों या नहीं ... और मुझे इस बात का स्पष्टीकरण पसंद आएगा कि ऐसा क्या है, अगर वास्तव में यह मामला है ... क्या ऐसा है? संकलक रजिस्टरों में स्थिर संस्करण के मूल्यों को कैश नहीं करता है (अर्थात यह इसके बजाय उस हीप-पते के संदर्भ को कैश करता है )?
नहीं, यह कोई नया प्रश्न नहीं है ... यह मूल प्रश्न पर समुदाय को वापस करने का प्रयास है ।