मैं lock
करने के लिए एक Boolean
चर कोशिश कर रहा था जब मैं निम्न त्रुटि का सामना करना पड़ा:हम मूल्य प्रकार को क्यों लॉक नहीं कर सकते?
'bool' एक संदर्भ प्रकार के रूप में ताला बयान के लिए आवश्यक नहीं है
ऐसा लगता है कि केवल संदर्भ के प्रकार के होते हैं lock
बयान में अनुमति है, लेकिन मुझे यकीन नहीं है कि मैं क्यों समझता हूं।
एंड्रियास उसकी comment में बताते हुए है:
जब [एक मान प्रकार] वस्तु एक धागे से दूसरे से पारित कर दिया है, एक प्रतिलिपि बना रहा है, इसलिए धागे 2 विभिन्न वस्तुओं, पर काम कर रहा है जो अंत सुरक्षित है।
क्या यह सच है? क्या इसका मतलब यह है कि जब मैं निम्नलिखित करता हूं, तो मैं वास्तव में xToTrue
और xToFalse
विधि में दो अलग-अलग x
संशोधित कर रहा हूं?
public static class Program {
public static Boolean x = false;
[STAThread]
static void Main(string[] args) {
var t = new Thread(() => xToTrue());
t.Start();
// ...
xToFalse();
}
private static void xToTrue() {
Program.x = true;
}
private static void xToFalse() {
Program.x = false;
}
}
(अकेले इस कोड अपने राज्य में स्पष्ट रूप से बेकार है, यह केवल उदाहरण के लिए)
पी.एस: मैं How to properly lock a value type पर इस सवाल के बारे में पता है। मेरा प्रश्न से संबंधित नहीं है लेकिन क्यों पर।
आपका प्रोग्राम एक साझा प्रति का उपयोग कर रहे धागे के बीच एक्स पास नहीं कर रहा है। हालांकि यह अभी भी थ्रेड सुरक्षित नहीं है क्योंकि आप लॉक के दायरे में एक्स तक नहीं पहुंच रहे हैं और एक्स को अस्थिर घोषित नहीं किया गया है। मुझे एक और सवाल आ रहा है: "इस उदाहरण में एक्स को अस्थिर होने की आवश्यकता क्यों है?" –
@ मार्टिनब्राउन: मुझे पता है, और मेरे * असली * कोड में, मैं एक समर्पित ऑब्जेक्ट पर लॉक का उपयोग करता हूं (जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, यह * क्यों * और * कैसे * से संबंधित है)। 'अस्थिर' के लिए, यह [ठीक से लॉक करते समय आवश्यक नहीं है] (http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are- अलग- अंशकालिक three.aspx)। – Otiel