c# - If I lock when writing to a variable, do I also need to lock when reading, if the read is otherwise atomic? -
मेरे पास निम्न कोड के साथ एक वर्ग है
निजी रीडोनली ऑब्जेक्ट m_lock = new ऑब्जेक्ट ( ); निजी IClient m_client निजी ऑब्जेक्ट m_context;
क्लाइंट और संदर्भ सेट करते समय, मैं निम्नानुसार लॉक करता हूं
lock (m_lock) {m_client = theClientFrom कहीं भी; M_context = contextObject; }
मेरा प्रश्न यह है, अगर मुझे केवल m_client
ही प्राप्त करना है, तो क्या ऐसा करने के लिए सुरक्षित है?
Var स्थानीय क्लाइंट = m_client; डीबग करें। अटैचमेंट (स्थानीय क्लाइंट! = नल); localClient.DoStuff ();
m_client
एक संदर्भ प्रकार है, इसलिए पढ़ें ( localClient
को निर्दिष्ट करते समय), इसलिए यह एक एकल सीपीयू पर ठीक काम करना चाहिए ।
मैं कर सकता है (यह भी सिद्धांत में) m_client
चर अस्थिर
, और फिर इसे एक से अधिक CPU के पार सुरक्षित होगा बाहर के- रोकने के द्वारा आदेश अन्य CPU के द्वारा पढ़ता है, लेकिन सवाल यह है कि क्या ताला-कब-लिखना अस्थिरता के बिना पढ़ने के लिए सुरक्षित करता है?
सीपीयू कैश को "फ्लश" लिखते समय लॉकिंग करता है, ताकि जब वे पढ़ो यह क्रम से बाहर नहीं होगा?
लॉक
में सी # (और, सामान्य तौर पर, मॉनिटर
जो इसे एनएटी में फैलता है) एक स्मृति बाधा है - विशेष रूप से, अधिग्रहण पर बाधा को पढ़ें, रिलीज पर बाधा लिखें। अस्थिर
के लिए, यह हर फ़ील्ड को पढ़ने और लिखने के लिए एक बाधा जोड़ता है। तो, हाँ, आपको अस्थिर
के साथ सुरक्षित होना चाहिए (अपना शेष कोड मानकर, जिसे आपने नहीं दिखाया, वह सब कुछ ठीक से कर रहा है)।
Comments
Post a Comment