मुझे पता है कि .NET मेमोरी मॉडल (.NET Framework पर; कॉम्पैक्ट/माइक्रो/सिल्वरलाइट/मोनो/xna/what-have-you) गारंटी नहीं है कि कुछ प्रकारों (सबसे विशेष रूप से आदिम पूर्णांक और संदर्भ) संचालन की गारंटी थी परमाणु होना.NET मेमोरी मॉडल, अस्थिर चर, और परीक्षण-और-सेट: क्या गारंटी है?
आगे, मेरा मानना है कि x86/x64 परीक्षण-और-सेट निर्देश (और Interlocked.CompareExchange
) वास्तव में वैश्विक स्मृति स्थान का संदर्भ देता है, इसलिए यदि यह Interlocked.CompareExchange
सफल होता है तो नया मान दिखाई देगा।
अंत में, मुझे विश्वास है कि volatile
कीवर्ड संकलक को एक निर्देश का प्रचार करने के पढ़ने & यथाशीघ्र लिखते हैं और इस चर के विषय में संचालन को पुन: व्यवस्थित नहीं है (सही?)।
यह कुछ सवाल की ओर जाता है:
- सही ऊपर अपने विश्वासों हैं?
Interlocked.Read
में int के लिए अधिभार नहीं है, केवल लंबे समय तक (जो 2 शब्द हैं और इस प्रकार आम तौर पर परमाणु रूप से नहीं पढ़े जाते हैं)। मैंने हमेशा यह माना कि .NET मेमोरी मॉडल ने गारंटी दी है कि नवीनतम मूल्य को इन्सट/संदर्भ पढ़ने के दौरान देखा जाएगा, हालांकि प्रोसेसर कैश, रजिस्टर्स इत्यादि के साथ। मैं यह देखना शुरू कर रहा हूं कि यह संभव नहीं हो सकता है। तो चर को फिर से लाने के लिए मजबूर करने का कोई तरीका है?- पूर्णांक और संदर्भों के लिए उपरोक्त समस्या को हल करने के लिए पर्याप्त अस्थिर है?
- 86 पर/x64 मैं मान सकते हैं कि ...
तो देखते हैं दो वैश्विक पूर्णांक चर x और y, दोनों को 0 पर प्रारंभ है कि अगर मैं लिखना:
x = 1;
y = 2;
कोई धागा है कि x = 0 और y = 2 देखेंगे (यानी लिखने क्रम में होंगे)। क्या यह अस्थिर है अगर यह बदलता है?
.NET के बारे में कुछ में "सी कीवर्ड मिथ्स डिस्पेल" से जुड़ने में समस्या यह है कि 'अस्थिर' के बारे में मिथकों का एक प्रमुख स्रोत यह है कि लोग सी, सी # और जावा में समान हैं। सी # 'अस्थिरता में वास्तव में http://msdn.microsoft.com/en-us/library/aa645755%28v=VS.71%29.aspx के अनुसार कुछ ऑर्डरिंग अर्थशास्त्र है। –
"धागा वास्तव में x = 0 और y = 2 देख सकता है" - चूंकि .NET 2.0 लिखने के संचालन को पुन: व्यवस्थित नहीं किया जा सकता है। – Vlad