gpt4 book ai didi

C++ 内存排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:22 26 4
gpt4 key购买 nike

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

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 );
}
};

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

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

最佳答案

memory_order_acquire/memory_order_release 是必需的。

您使用锁来保护多个线程之间的共享数据。如果您不在unlock 方法中使用memory_order_release,则在unlock 方法之后,任何对共享数据的写入都可以重新排序。此外,如果您不在 lock 方法中使用 memory_order_acquire,则可以在 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`

使用acquire/release,所有对共享数据的写入都将对锁定自旋锁的线程可见。

关于C++ 内存排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20756055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com