マルチスレッド アプリケーション用のロック フリー コードを実装するために、私はvolatile
変数
を使用しました。したがって、スレッドが変数値を更新し、その更新が行われた直後にスレッドがその変数を読み取ると、スレッド A から最近書き込まれた最新の値が表示されます。volatile
A
B
volatile を適用しても、書き込みとそれに続く読み取りがスワップされるのを防ぐことはできません。
この問題は、変数をThread.MemoryBarrier()
取得する前に次のように配置することで解決できますか?volatile
private volatile bool _foo = false;
private void A()
{
//…
Thread.MemoryBarrier();
if (_foo)
{
//do somthing
}
}
private void B()
{
//…
_foo = true;
//…
}
そして、これで問題が解決した場合。条件の 1 つでその値に依存する while ループがあるとします。Thread.MemoryBarrier()
whileループの前に置くことは問題を解決する正しい方法ですか? 例:
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;
}
}