关于原子性与数据竞争的学习和思考
什么是原子性?
- 不存在任何资源竞争的操作都是原子操作, 也就是说只要一个操作完全独立的进行, 那么它就是原子的.
- 对数据的读取操作中, 每一个load、stroe到硬件层面都是有序的,因此如果单一store/load指令就能完成的操作肯定是原子性的
- 如果一个操作消耗很长时间, 但是同一时间只允许一个这样的操作存在, 多个同样的操作在时空上是串行的, 那么每个操作都时原子的.
汇编代码就是原子性的吗?
不是! 汇编代码也不能保证原子性的, 也会违反上面的原则. 比如多个汇编指令同时对一个数据进行操作, 比如初始化一个很大的内存空间, 该操作可以随时被中断, 也不是原子的.
怎么保证我的操作时原子的?
在汇编中, 有lock
用于保证进行操作时只有一个人进入临界区.
在go中, 可以有atomic
和sync.Mutex
来保证操作的原子性.