4

重複の可能性:
揮発性vs.インターロックvs.ロック

volatileキーワードとInterlockedを使用したい状況を理解しようとしています。

そのオブジェクトからの読み取りと書き込みがすべてInterlocked.Exchangeを介して行われる変数がある場合、それはその変数を揮発性としてマークすることと本質的に同じことですか?

private object _threadSafe;
private void Test()
{
    var tmp = new object();
    Interlocked.Exchange(ref tmp, _threadSafe); //read
    Interlocked.Exchange(ref _threadSafe, "hi"); //write

}

これの代わりに、_threadSafeオブジェクトが揮発性としてマークされ、Interlockedを削除した場合、それは機能的に同等でしょうか?(値のインクリメントのように、アトミックな読み取り/インクリメント/書き込みに依存していないと仮定します)。

4

2 に答える 2

4

volatileアクセスが他のコアに表示されることを保証しInterlockedます。インターロックとの違いは、保証に完全なメモリバリアを使用し、非アトミック操作を処理することです。Volatileは完全なメモリバリアを使用しない場合があります(プラットフォームによって異なります。たとえば、x86 / x64はvolatileの完全なメモリバリアを必要としません...)が、アトミック操作を「スレッドセーフ」にするだけです。

揮発性は、その変数へのすべてのアトミックアクセスを「揮発性」にし(x86 / x64ではそれほど大きな問題ではない可能性があります)、変数へのアクセスが異なるという事実を隠してしまうため、一般的には揮発性を避けることをお勧めします。Interlocked変数の各使用に関するスレッドセーフの懸念を明示的に詳述しているため、一般的には、のようなものがより推奨されます。

また、ローカル変数でvolatileを使用することはできないため、複数のスレッドでローカル変数を使用する場合は、Interlockedが必要になる場合があります。例えば:

static void Main()
{
  bool complete = false; 
  var t = new Thread (() =>
  {
    bool toggle = false;
    while (!complete) toggle = !toggle;
  });
  t.Start();
  Thread.Sleep (1000);
  complete = true;
  t.Join();        // Blocks indefinitely
}

更新:明確にするために、「アクセス」とは、すでにアトミックなアクセスを意味します。変数が「揮発性」であるからといって、その変数に対するすべての操作がスレッドセーフになるわけではないことは明らかです。それは私が言っていることではありません。たとえば、一部のプラットフォームでは、を使用しているにもかかわらずx++はスレッドセーフではありませんvolatile

于 2012-10-11T15:31:52.643 に答える
2

他の人が述べているように、アトミックに安全に実行できるvolatile操作の多くを実行することはできません。Interlocked一部のコードは実際には安全であり、同期方法がまったくないにもかかわらず、競合状態がありません。たとえば、整数に書き込む単一のスレッドがあり、そこから読み取るだけのN個の異なるスレッドがある場合、問題はなく、その整数をロックする必要はありません。変数をチェックして変数に追加し、結果を設定する前に他の人に変数を設定してもらうという競合状態はありません(したがって、基本的に変数の書き込みが上書きされます)。

ここでの問題は、コンパイラの最適化、スレッド/プロセッサ固有のキャッシュなどにより、他のN個のスレッドが1つの書き込みスレッドの更新を認識できない可能性があることです。メモリは「同期」しません。それらはそれぞれ完全に異なる変数の読み取り/書き込みを行うため、変更は他のスレッドには表示されません。コードが機能するためには、同じ変数のさまざまな表現がすべて同期される特定のメモリバリアを追加する必要があります。または他の同期方法を使用する場合、C#はメモリバリアlock必要であることを自動的に認識するため、何も言う必要はありません。ロックレス同期を使用する場合、この障壁を導入するものは何もないので、それがvolatileの目的です。

于 2012-10-11T15:23:14.447 に答える