लागू करने के लिए एक आवेदन मैं volatile
चर, सैद्धांतिक रूप से इस्तेमाल किया multithreading के लिए मुफ्त कोड ताला: volatile
कीवर्ड बस सुनिश्चित करें कि सभी धागे एक के सबसे अद्यतन मूल्य देख बनाने के लिए प्रयोग किया जाता है अस्थिर चर; इसलिए धागा A
चर मूल्य अद्यतन करता है और धागा B
पढ़ा है कि चर के तुरंत बाद कि अद्यतन हुआ है यह सबसे अद्यतन मूल्य के रूप में मैं संक्षेप किताब कि में एक सी # 4.0 में पढ़ा है कि धागा ए से हाल ही में लिखा देखेंगे अगर इस गलत क्योंकिवाष्पशील और सी # में Thread.MemoryBarrier
अस्थिर एक लिखने की अदला-बदली किए जाने से पढ़ने के बाद से नहीं रोकता है को लागू करने के लिए है।
इस समस्या volatile
चर की तरह के हर से पहले Thread.MemoryBarrier()
डाल द्वारा हल किया जा रहा किया जा सका:
private volatile bool _foo = false;
private void A()
{
//…
Thread.MemoryBarrier();
if (_foo)
{
//do somthing
}
}
private void B()
{
//…
_foo = true;
//…
}
और इस समस्या का हल है; मान लें कि हमारे पास थोड़ी देर लूप है जो उस मूल्य पर निर्भर करता है; जबकि लूप समस्या को ठीक करने का सही तरीका है, इससे पहले Thread.MemoryBarrier()
डाल रहा है? उदाहरण:
private void A()
{
Thread.MemoryBarrier();
while (_someOtherConditions && _foo)
{
// do somthing.
}
}
अधिक सटीक मैं _foo
चर इसकी सबसे ताजा मूल्य जब किसी भी धागा इसे किसी भी समय के लिए पूछ देना चाहता हूँ होना करने के लिए; इसलिए Thread.MemoryBarrier()
डालने से पहले चर बुला समस्या ठीक होती है तो मैं _foo
के बजाय Foo
संपत्ति का उपयोग करें और की है कि संपत्ति की तरह प्राप्त भीतर एक Thread.MemoryBarrier()
कर सकता है यदि:
Foo
{
get
{
Thread.MemoryBarrier();
return _foo;
}
set
{
_foo = value;
}
}
संभावित डुप्लिकेट ... http: //stackoverflow.com/questions/1330590/when-to-use-volatile-or-thread-memorybarrier-in-threadsafe-locking-code-c –
@Aron; नहीं, यह डुप्लिकेट नहीं है; यह एक और सवाल है। –
@ जलाल क्या आप इस दृष्टिकोण अस्थिर/स्मृति बाधा का उपयोग कर किसी समस्या को हल करने का प्रयास कर रहे हैं या क्या आप अपनी समस्या हल करने वाले किसी भी दृष्टिकोण के साथ ठीक हैं? –