मेरे पास एक वेरिएबल है जिसका उपयोग मैं राज्य का प्रतिनिधित्व करने के लिए कर रहा हूं। इसे कई धागे से पढ़ और लिखा जा सकता है।इंटरलाक्ड और अस्थिर
मैं इसे बदलने के लिए Interlocked.Exchange
और Interlocked.CompareExchange
का उपयोग कर रहा हूं। हालांकि मैं इसे कई धागे से पढ़ रहा हूं।
मुझे पता है कि volatile
का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि चर स्थानीय रूप से कैश नहीं किया गया है लेकिन हमेशा स्मृति से सीधे पढ़ता है।
हालांकि यदि मैं चर को अस्थिर करने के लिए सेट करता हूं तो यह अस्थिरता का उपयोग करने और इंटरलाक्ड विधियों को रेफरी का उपयोग करके गुजरने के बारे में चेतावनी उत्पन्न करता है।
मैं यह सुनिश्चित करना चाहता हूं कि प्रत्येक थ्रेड चर के नवीनतम मूल्य को पढ़ रहा है और कुछ कैश्ड संस्करण नहीं है, लेकिन मैं अस्थिरता का उपयोग नहीं कर सकता।
Interlocked.Read
है लेकिन यह 64 बिट प्रकारों के लिए है और कॉम्पैक्ट फ्रेमवर्क पर उपलब्ध नहीं है। इसके लिए प्रलेखन कहता है कि 32 बिट प्रकारों के लिए इसकी आवश्यकता नहीं है क्योंकि वे पहले से ही एक ही ऑपरेशन में प्रदर्शन कर चुके हैं।
इंटरनेट पर किए गए बयान हैं कि यदि आप अपनी सभी पहुंच के लिए इंटरलाक्ड विधियों का उपयोग कर रहे हैं तो आपको अस्थिरता की आवश्यकता नहीं है। हालांकि आप इंटरलॉक विधियों का उपयोग करके 32 बिट वैरिएबल नहीं पढ़ सकते हैं, इसलिए आपकी सभी एक्सेस के लिए इंटरलॉक विधियों का उपयोग करने का कोई तरीका नहीं है।
क्या थ्रेड सुरक्षित पढ़ने और लॉक का उपयोग किए बिना मेरे चर के लिखने का कोई तरीका है?
वास्तव में अच्छा सवाल है। एक नियमित ताला का उपयोग करना एक * महत्वपूर्ण निष्पादन बिंदु * का तात्पर्य है और गारंटी देता है कि आपका मान सभी धागे के लिए अद्यतित होगा। हालांकि, इंटरलाक्ड। एक्सचेंज 'लॉक' का उपयोग करके लागू नहीं किया गया है और मुझे कोई संदर्भ नहीं मिल रहा है कि यह ऐसी गारंटी देता है। – Thorarin