0%

关于原子性与数据竞争的学习和思考

关于原子性与数据竞争的学习和思考

什么是原子性?

  1. 不存在任何资源竞争的操作都是原子操作, 也就是说只要一个操作完全独立的进行, 那么它就是原子的.
  2. 对数据的读取操作中, 每一个load、stroe到硬件层面都是有序的,因此如果单一store/load指令就能完成的操作肯定是原子性的
  3. 如果一个操作消耗很长时间, 但是同一时间只允许一个这样的操作存在, 多个同样的操作在时空上是串行的, 那么每个操作都时原子的.

汇编代码就是原子性的吗?

不是! 汇编代码也不能保证原子性的, 也会违反上面的原则. 比如多个汇编指令同时对一个数据进行操作, 比如初始化一个很大的内存空间, 该操作可以随时被中断, 也不是原子的.

怎么保证我的操作时原子的?

在汇编中, 有lock用于保证进行操作时只有一个人进入临界区.

在go中, 可以有atomicsync.Mutex来保证操作的原子性.