自旋锁内存顺序

时间:2017-01-11 08:14:23

标签: c++ multithreading c++11

我正在阅读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中观察到。我错过了什么?

0 个答案:

没有答案