原子操作和互斥锁

在多线程并发场景下,std::atomicstd::mutex 都可以用来保护共享数据,但两者的适用范围和侧重点并不相同。下面从原子性范围、与条件变量的协作,以及保护粒度三个角度分别说明。

  • 原子操作的原子性仅限于类本身提供的方法。例如 std::atomic<int> 特化版本的 operator++ 是线程安全的,但一旦你把读、算、写拆成多步自己组合,原子性就无法保证。
  • std::mutex 的一大优势是能够与条件变量 condition_variable 搭配使用,从而实现线程间的等待与通知,而原子变量本身并不具备这种能力。
  • std::mutex 保护的是从加锁到 unlock 之间的一整段操作序列,可以把多条语句作为一个整体互斥执行;原子操作则只能保证单个方法调用的原子性。