访问 bool 领域的原子C#?特别是,我需要把锁周围:

class Foo
{
   private bool _bar;

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

   //... same for a read
   if (_bar) { ... }
}
有帮助吗?

解决方案

是的。

读和写的下列数据类型的原子:bool,char、字符号字节整数uint,int、浮动,并参照类型。

如发现在 C#语言规范.

编辑:这可能也是值得了解的 易失性 关键词。

其他提示

如上所述bool是原子但是你仍然需要记住,这也取决于你想要做什么。

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

是不是一个 原子操作意义,b值可能会改变当前线执行代码之后,如果声明。

bool访问确实是原子,但这并不是整个故事。

你不必担心读一价值,是未完全写入'-还不清楚是什么可能意味着为一个bool在任何情况下-但你不必担心处理缓存,至少如果详细的时间是一个问题。如果线#1个运行的核心的一个拥有你的 _bar 在缓和 _bar 得到更新的线#2的上运行的另一个核心、线#1会看不到立即改变,除非你增加锁,宣布 _bar 作为 volatile, 或插入明确呼吁 Thread.MemoryBarrier() 无效的缓存的价值。

这办法我有用,我认为是正确的,是

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;
       }
     }
}

我们的目标基本上是为了避免repetively锁上的对象每次迭代,只是为了检查,如果我们需要把它锁在了提供大量的状态变化的信息很少发生。我 想想 这种方法的工作。如果绝对的一致性是必需的,我 想想 易失性将是合适的时在b bool。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top