现代语言以原子变量(atomic variable)或原子操作(atomic operation)的形式提供特殊能力,允许程序同步其线程(参见硬件内存一致性模型)。

代码示例

// Thread 1           // Thread 2
x = 1;                while(done == 0) { /* loop */ }
done = 1;             print(x);

如果使用原子变量实现 done 会产生很多效果:

  • Thread 1 的编译代码必须确保对 x 的写入完成,并且对 done 的写入可见之前对 x 的写入对其他线程可见。
  • Thread 2 的编译代码必须在循环的每次迭代中(重新)读取 done
  • Thread 2 的编译代码必须在读取 done 之后才读取 x
  • 编译后的代码必须做任何必要的事情来禁用可能会重新引入这些问题的硬件优化。
  • 使 done 原子化的最终结果是程序按照我们想要的方式运行,成功地将 x 的值从 Thread 1 传递到 Thread 2

上面代码如果不使用原子变量会出现 Thread 1Thread 2 读取 x 的同时写 x ,从而导致数据竞争(data race)。 done 使用原子变量实现后,用于同步对 x 的访问: Thread 1 现在不可能在 Thread 2 读取 x 的同时写 x,从而避免数据竞争。 这是硬件内存模型弱有序和无数据竞争(DRF)在编程语言环境的应用。

原子变量(atomic variable)或原子操作(atomic operation)更恰当的名称应该是「同步原子(synchronizing atomic)」。