现代语言以原子变量(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 1
和 Thread 2
读取 x
的同时写 x
,从而导致数据竞争(data race)。
done
使用原子变量实现后,用于同步对 x
的访问: Thread 1
现在不可能在 Thread 2
读取 x
的同时写 x
,从而避免数据竞争。
这是硬件内存模型弱有序和无数据竞争(DRF)在编程语言环境的应用。
原子变量(atomic variable)或原子操作(atomic operation)更恰当的名称应该是「同步原子(synchronizing atomic)」。