C++内存排序

sli*_*ser 4 c++ memory-model c++11

在一些教程中,我看到了这样的自旋锁实现

class spin_lock 
{
    atomic<unsigned int> m_spin ;

public:
    spin_lock(): m_spin(0) {}
    ~spin_lock() { assert( m_spin.load(memory_order_relaxed) == 0);}

    void lock()
    {
        unsigned int nCur;
        do { nCur = 0; }
        while ( !m_spin.compare_exchange_weak( nCur, 1, memory_order_acquire ));
    }
    void unlock()
    {
        m_spin.store( 0, memory_order_release );
    }
};
Run Code Online (Sandbox Code Playgroud)

我们真的需要memory_order_acquire/ memory_order_release标签compare_exchange_weakstore操作吗?或者memory_order_relaxed在这种情况下是否足够,因为没有Synchronizes-With关系?

更新:谢谢您的解释!我正在考虑spin_lock,没有使用它的上下文.

MRB*_*MRB 10

memory_order_acquire/ memory_order_release需要.

您使用锁来保护多个线程之间的共享数据.如果不使用memory_order_releasein unlock方法,则可以在unlock方法之后重新排序对共享数据的任何写入.此外,如果您不使用memory_order_acquirein lock方法,则可以在lock方法之前重新排序对共享数据的任何读取.所以你需要acquire/release保护线程之间的共享数据.

spinLock.lock() // use acquire here, so any read can't reordered before `lock`

// Writes to shared data

spinLock.unlock() // use release here, so any write can't reordered after `unlock`
Run Code Online (Sandbox Code Playgroud)

acquire/release所有写入共享数据,将可让锁自旋锁的线程可见.