gpt4 book ai didi

c++ - 我如何在 std::atomic 上实现一个简单的自旋锁,以便编译器不会优化它?

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:21 24 4
gpt4 key购买 nike

我一直在研究使用标准 C++11/14 锁定线程的非常简单的方法,目前我最终使用了类似这样的方法

std::atomic<bool> setup_ready(false);

{
// thread 1
while (!setup_ready.load()) std::this_thread::yield();

// do something
}

{
// thread 2
// perform some setup
setup_ready.store(true);
}

是否有什么东西阻止编译器优化 this_thread::yield() 调用,进而优化整个循环?

如果我完全删除 yield 并且只想像这样忙等待怎么办?是否有跨平台的方法来防止编译器优化循环?还是在循环原子时标准会阻止它?

{
// thread 1
while (!setup_ready.load()) ;

// do something
}

我想出的唯一解决方案是在混合中添加一个 volatile 变量,但我不确定这是否是最好的方法。我也尝试检查关于原子的标准,但我找不到关于编译器优化细节的很多细节。

最佳答案

编译器不允许优化 this_thread::yield() 除非它可以确定它没有副作用——它不能,因为它不是。

无法优化原子加载操作,因为它包含一个内存屏障,并且专门定义为获取其他线程所做的修改。

关于c++ - 我如何在 std::atomic<T> 上实现一个简单的自旋锁,以便编译器不会优化它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36168026/

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