gpt4 book ai didi

c++ - memory_order_acquire 真的足以锁定自旋锁吗?

转载 作者:可可西里 更新时间:2023-11-01 18:35:52 25 4
gpt4 key购买 nike

根据 Antony Williams 的书C++ Concurrency in Action,自旋锁可以按如下方式实现:

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_release 标签的存储操作的可见性。 (“释放操作获取操作同步。”)

因为 test_and_set 也是一个存储操作,我希望 lock() 方法中需要一个 memory_order_acq_rel 标签,以确保尝试锁定互斥锁的其他线程中锁定状态的可见性。

为什么 memory_order_acquire 就足够了?

最佳答案

acquire 和 release 与这个原子变量无关,而是与每个线程中读/写的其余变量有关。

更明显的是,如果没有 unlock() 中的释放和 lock() 中的获取,该标志仍​​然可见。问题是对受自旋锁保护的变量的写入可能会在锁释放后被推送,从而引入竞争条件。以同样的方式,锁内变量的读取可能会移动到 lock()

之前

关于c++ - memory_order_acquire 真的足以锁定自旋锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536846/

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