मैं Volatile reads and writes, and timeliness के बारे में जो डफी पोस्ट पढ़ रहा हूँ, और मैं पोस्ट में पिछले कोड नमूने के बारे में कुछ समझने की कोशिश कर रहा हूँ:Interlocked.CompareExchange एक स्मृति बाधा का उपयोग करता है?
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
…
जब दूसरे CMPXCHG आपरेशन निष्पादित किया जाता है, यह एक स्मृति बाधा का उपयोग करता है यह सुनिश्चित करने के लिए कि का मूल्य m_state वास्तव में इसके लिए लिखा गया नवीनतम मूल्य है? या यह केवल कुछ मान का उपयोग करेगा जो प्रोसेसर के कैश में पहले से संग्रहीत है? (मानते हैं कि m_state को अस्थिर घोषित नहीं किया गया है)।
यदि मैं सही ढंग से समझता हूं, यदि सीएमपीएक्सएचजी मेमोरी बाधा का उपयोग नहीं करेगा, तो पूरी ताला अधिग्रहण प्रक्रिया उचित नहीं होगी क्योंकि यह बहुत अधिक संभावना है कि लॉक प्राप्त करने वाला पहला धागा, वह होगा जो निम्नलिखित सभी ताले प्राप्त करें। क्या मैं सही ढंग से समझता हूं, या क्या मैं यहां कुछ खो रहा हूं?
संपादित करें: मुख्य प्रश्न यह है कि वास्तव में तुलना एक्सचेंज को कॉल करना m_state के मान को पढ़ने का प्रयास करने से पहले स्मृति बाधा उत्पन्न करेगा। तो जब वे 0 को असाइन करना चाहते हैं तो वे सभी को थ्रेड के लिए दिखाई देंगे जब वे तुलना एक्सचेंज को फिर से कॉल करने का प्रयास करते हैं।
उल्लेख करने के लायक है कि यह पूर्ण FENCE प्रदान करता है और आधे बाड़ नहीं। –