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_weak和store操作吗?或者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所有写入共享数据,将可让锁自旋锁的线程可见.