我正在阅读Anthony Williams的C ++ Concurrency in Action,并且有一段代码(第204页)用于自旋锁:
class spinlock_mutex
{
std::atomic_flag flag;
public:
spinlock_mutex():
flag(ATOMIC_FLAG_INIT)
{}
void lock()
{
while (flag.test_and_set(std::memory_order_acquire));
}
void unlock()
{
flag.clear(std::memory_order_release);
}
};
令我困惑的是作者使用memory_order_acquire
进行测试和设置操作的原因,我认为这是一个读 - 修改 - 写操作,应该用memory_order_acq_rel
标记,以确保调用test_and_set
的一个线程的效果可以在稍后的另一个调用test_and_set
中观察到。我错过了什么?