原子操作和互斥锁
在多线程并发场景下,std::atomic 和 std::mutex 都可以用来保护共享数据,但两者的适用范围和侧重点并不相同。下面从原子性范围、与条件变量的协作,以及保护粒度三个角度分别说明。
- 原子操作的原子性仅限于类本身提供的方法。例如
std::atomic<int>特化版本的operator++是线程安全的,但一旦你把读、算、写拆成多步自己组合,原子性就无法保证。 std::mutex的一大优势是能够与条件变量condition_variable搭配使用,从而实现线程间的等待与通知,而原子变量本身并不具备这种能力。std::mutex保护的是从加锁到unlock之间的一整段操作序列,可以把多条语句作为一个整体互斥执行;原子操作则只能保证单个方法调用的原子性。