मान लें मैं एक क्षेत्र है कि कुछ पाश के निष्पादन को नियंत्रित करता है:क्या यह Thread.MemoryBarrier() का सही उपयोग है?
private static bool shouldRun = true;
और मैं एक धागा चल रहा है, की तरह कोड है कि है:
while(shouldRun)
{
// Do some work ....
Thread.MemoryBarrier();
}
अब, एक और धागा false
करने के लिए shouldRun
सेट कर सकते हैं, किसी भी सिंक्रनाइज़ेशन तंत्र का उपयोग किए बिना।
जहां तक मैं थ्रेड को समझता हूं। मेमरीबैरियर(), जबकि लूप के अंदर यह कॉल shouldRun
के कैश किए गए संस्करण को प्राप्त करने से रोकता है, और प्रभावी रूप से एक अनंत लूप को होने से रोकता है।
क्या थ्रेड के बारे में मेरी समझ है। मेमरीबैरियर सही है? यह देखते हुए कि मेरे पास धागे हैं जो shouldRun
चर सेट कर सकते हैं (इसे आसानी से बदला नहीं जा सकता है), क्या यह सुनिश्चित करने का एक उचित तरीका है कि मेरा लूप shouldRun
किसी भी थ्रेड द्वारा गलत पर सेट हो जाएगा?
बूलियन के रूप में वाष्पशील करते घोषित नहीं करता है वहाँ वास्तव में सिर्फ इरादा धागा तुल्यकालन वस्तुओं का उपयोग कर के साथ कुछ भी गलत नहीं है वही चीज़? मुझे थ्रेड के बारे में निश्चित नहीं है। मेमरीबैरियर इसलिए टिप्पणी का जवाब नहीं है। जैसे http://www.albahari.com/threading/part4.aspx अन्य> "इस समस्या को हल करने का एक और अधिक उन्नत तरीका अस्थिर कीवर्ड को अपूर्ण फ़ील्ड पर लागू करना है। अस्थिर कीवर्ड प्रत्येक पर एक अधिग्रहण-बाड़ उत्पन्न करने के लिए संकलक को निर्देश देता है उस क्षेत्र से पढ़ें, और उस क्षेत्र में प्रत्येक लिखने पर एक रिलीज-बाड़ "। विनम्र, –
अस्थिरता एक बहुत ही बुरी चीज है और इसका उपयोग नहीं किया जाना चाहिए: http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are- अलग-part -three.aspx – Steven
लॉल, मुझे इसके बारे में पता नहीं था! एक पूर्व सी/एएसएम प्रोग्रामर के रूप में मैंने सोचा कि यह एक अच्छी बात थी :) लिंक के लिए धन्यवाद, मैं एक नज़र डालेगा। –