std::atomic_flag
std::atomic_flag 是最简单的 bool 原子类型。
- std::atomic_flag 类型的对象必须被
ATOMIC_FLAG_INIT
初始化,初始化为 “清除” 状态,此时互斥量处于解锁状态。 - 不能拷贝构造、赋值给另一个 std::atomic_flag 对象。当然这是所有的原子类型特有的。因为赋值和拷贝是对两个独立的对象,在赋值和拷贝时会对第一个对象的值进行读取,然后再写入另一个,所以合并这两个操作必定不是原子的。
当这个 std::atomic_flag 类型的对象已被初始化,就只能
- 销毁:
clear(std::memory_order_release)
- 清除或设置:
test_and_set()
std::atomic_flag 实现自旋互斥锁
由于初始化 std::atomic_flag 时互斥量处于解锁状态,所以 lock 函数不断测试 test_and_set 是否返回了 false,以此来加锁。而 unlock 函数则需要清除它即可解锁。
std::atomic< bool >
std::atomic_flag 没有修改和查询操作,所以 std::atomic<bool>
更实用一些。
- 其特点是可以用非原子的 bool 类型来构造和赋值。