gpt4 book ai didi

c++ - 使用 atomic_flag 自旋锁进行内存排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:32 27 4
gpt4 key购买 nike

我正在尝试熟悉 c++11 的新内存排序概念,并且相信我实际上已经很好地掌握了它们,直到我偶然发现了自旋锁的这个实现:

#include <atomic>

namespace JayZ
{
namespace Tools
{
class SpinLock
{
private:
std::atomic_flag spin_lock;
public:
inline SpinLock( void ) : atomic_flag( ATOMIC_FLAG_INIT ) {}

inline void lock( void )
{
while( spin_lock.test_and_set( std::memory_order_acquire ) )
;
}

inline void unlock( void )
{
lock.clear( std::memory_order_release );
}
};
}
}

例如在 http://en.cppreference.com/w/cpp/atomic/atomic_flag 中同样提到
以及“并发行动”一书中。我还在 SO 的某个地方找到了它。

但我只是不明白为什么它会起作用!
假设线程 1 调用 lock() 并且 test_and_set() 返回 0 作为旧值 --> 线程 1 已获得锁。
但是随后线程 2 出现并尝试相同的操作。现在,由于没有发生“存储同步”(release,seq_cst_acq_rel),线程 1 对 spin_lock 的存储应该是松弛类型。
但由此可知,它不能与线程 2 对 spin_lock 的读取同步。这应该使线程 2 可以从 spin_lock 读取值 0,从而也获得锁。
我的错误在哪里?

最佳答案

您的错误是忘记了 spin_lock 是一个 atomic_flag,因此 test_and_set 是一个原子操作。需要 memory_order_acquirememory_order_release 来防止读取迁移到锁定操作之前或写入迁移到解锁之后。锁本身受原子性保护,原子性始终包括可见性。

关于c++ - 使用 atomic_flag 自旋锁进行内存排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14791495/

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