原子操作是否足够

时间:2009-07-23 19:58:04

标签: c#

class StopIt
{
  private bool stop;

  void Loop()
  {
    while (!stop)
    {
       // work
    }
  }

  void Stop()
  {
    stop = true;
  }
}

基本上,如果Loop方法在一个线程中运行而Stop从另一个线程调用,那么操作是否会正常停止?我知道bool读/写是原子的。但是,这够了吗?如果线程循环没有立即停止,则会出现问题。我应该标记停止挥发吗?

1 个答案:

答案 0 :(得分:10)

是的,你绝对应该将stop标记为易变。

原子性还不够 - 它不能保证一个线程能够“看到”另一个线程所做的更改。

虽然我对volatile的理解目前正在进行一些手术,但您可以粗略地将对易变变量的写入视为“确保其他人可以立即看到这一点!”并从易失性变量中读取“我想看到最新值!”

在不使stop volatile的情况下,即使在另一个线程中调用Stop(),该循环也可以永久进行。基本上JIT可以合理地将变量读入寄存器,然后永远从寄存器中读取。

事实上,如果“工作”涉及调用非内联方法,我相信JIT目前无论如何都被迫进行易失性读取,但这仅仅是当前的实际限制...... 理论说你应该让它变得不稳定。