は私はvolatile
変数、理論的に を使用するアプリケーションをマルチスレッド化のための無料のコードをロック実装するには揮発性変数。スレッドA
が変数値を更新し、スレッドB
がその変数を読み込んだ直後にその変数が読み取られた場合、最近スレッドAから書き込まれた最新の値が表示されます。C#4.0 Nuchhell book in これは、スワップされることから、読み取りに続いて書き込みを防ぐことはできません揮発適用間違ったC#で揮発性とThread.MemoryBarrier
は、この問題は次のようです。
volatile
変数のすべての取得前
Thread.MemoryBarrier()
を置くことによって解決さでした:
private volatile bool _foo = false;
private void A()
{
//…
Thread.MemoryBarrier();
if (_foo)
{
//do somthing
}
}
private void B()
{
//…
_foo = true;
//…
}
そして、これは問題が解決するかどうか。条件の1つでその値に依存するwhileループがあると考えてください。 whileループが問題を解決する正しい方法である前にThread.MemoryBarrier()
を入れていますか?例:
private void A()
{
Thread.MemoryBarrier();
while (_someOtherConditions && _foo)
{
// do somthing.
}
}
私は_foo
変数がいずれかのスレッドが任意の時点でそれを求めてその最も新鮮な価値を提供したい、より正確です。変数を呼び出す前Thread.MemoryBarrier()
を挿入すると、私は_foo
の代わりにFoo
プロパティを使用し、同じようにその財産の取得中にThread.MemoryBarrier()
を行うことができ、問題を修正した場合ので:あなたの第二の例では
可能な重複... http://stackoverflow.com/questions/1330590/when-to-use-volatile-or-thread-memorybarrier-in-threadsafe-locking-code-c –
@Aron;それは重複していません。これは別の質問です。 –
@Jalalこのアプローチを使って問題を解決しようとしていますかvolatile/memorybarrierですか、あなたの問題を解決する方法はありますか? @Aron; –