Gab*_*ton 4 multithreading atomic c++11 stdatomic
来自C++ Concurrency in Action:
std :: atomic和std :: atomic_flag之间的区别是std :: atomic可能不是无锁的; 实现可能必须在内部获取互斥锁,以确保操作的原子性
我想知道为什么.如果保证atomic_flag是无锁的,为什么它也不能保证atomic<bool>?这是因为会员功能compare_exchange_weak吗?我知道有些机器缺少单一的比较和交换指令,原因是什么?
首先,你完全被允许拥有类似的东西std::atomic<very_nontrivial_large_structure>,因此std::atomic通常不能保证无锁(尽管大多数系统中的大多数特殊化类似bool或int可能都可以).但这有点无关.
在N2427/29.3的注释中给出了确切原因atomic_flag以及其他无必锁定的原因:
因此,操作必须是无地址的.没有其他类型需要无锁操作,因此atomic_flag类型是符合此标准所需的最小硬件实现类型.其余类型可以使用atomic_flag进行模拟,但具有不太理想的属性.
换句话说,它是每个平台必须保证的最小限度,因此可以正确实现标准.