91

C#でブールフィールドにアトミックにアクセスしていますか? 特に、ロックを設定する必要がありますか:

class Foo
{
   private bool _bar;

   //... in some function on any thread (or many threads)
   _bar = true;

   //... same for a read
   if (_bar) { ... }
}
4

4 に答える 4

126

はい。

次のデータ型の読み取りと書き込みはアトミックです: bool、char、byte、sbyte、short、ushort、uint、int、float、および参照型。

C# 言語仕様にあるように。

編集: volatileキーワードを理解することもおそらく価値があります。

于 2008-09-12T16:24:02.717 に答える
51

上で述べたように、boolはアトミックですが、それはあなたがそれで何をしたいかにも依存することを覚えておく必要があります。

if(b == false)
{
    //do something
}

は不可分操作ではありません。つまり、現在のスレッドがステートメントbの後にコードを実行する前に、の値が変更される可能性があります。if

于 2008-09-19T23:07:13.070 に答える
32

bool アクセスは確かにアトミックですが、それだけではありません。

「不完全に書き込まれた」値の読み取りについて心配する必要はありません - いずれにせよ、それが bool に対して何を意味するのかは明確ではありません - しかし、少なくとも詳細がタイミングが問題。コア A で実行されているスレッド #1_barにキャッシュがあり、_bar別のコアで実行されているスレッド #2 によって更新された場合、スレッド #1 は、ロックを追加するか、_barとして宣言するvolatileか、明示的に への呼び出しを挿入しThread.MemoryBarrier()て、キャッシュされた値。

于 2008-09-12T16:53:24.033 に答える
1

私が使用したアプローチは正しいと思います。

volatile bool b = false;

.. rarely signal an update with a large state change...

lock b_lock
{
  b = true;
  //other;
}

... another thread ...

if(b)
{
    lock b_lock
    {
       if(b)
       {
           //other stuff
           b = false;
       }
     }
}

目標は基本的に、めったに発生しない大量の状態変更情報を提供するためにオブジェクトをロックする必要があるかどうかを確認するためだけに、反復ごとにオブジェクトを繰り返しロックする必要がないようにすることでした。このアプローチは有効だと思います。また、絶対的な一貫性が必要な場合は、b bool には volatile が適切だと思います。

于 2013-05-21T07:52:13.453 に答える