如何在 std::atomic 上实现一个简单的自旋锁<T>,以便编译器不会对其进行优化?
How do I implement a simple spinlock on std::atomic<T> so that the compiler doesn't optimize it out?
我一直在尝试非常简单的方法,仅使用标准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()
调用,进而优化整个循环?
如果我完全删除了产量,只想像这样忙着等待怎么办?有没有一种跨平台的方法可以防止编译器优化循环?还是标准在原子上循环时阻止它?
{
// thread 1
while (!setup_ready.load()) ;
// do something
}
我想出的唯一解决方案是在组合中添加一个易失性变量,但我不确定这是否是最好的方法。我也尝试检查有关原子学的标准,但我找不到有关编译器优化细节的许多细节。
编译器不允许优化
this_thread::yield()
,除非它可以确定它没有副作用 - 它不能,因为它不是。
原子加载操作无法优化,因为它包括内存屏障,并且专门定义为拾取其他线程所做的修改。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- Win32编译器选项和内存分配
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- C++,我收到一个无法理解的编译器错误
- 在线编译器中的分段C++没有打印消息
- 呼叫运营商<<临时
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C/C++预处理器是否可以检测一些编译器选项
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 我需要知道编译器如何在cpp中使用析构函数
- 编译器如何区分std::vector的构造函数
- CLANG 编译器 说:变量"PTR"可能未初始化
- <<操作员在下面的行中工作
- 告诉c++编译器该参数没有别名
- 编译器错误,包括'<'代币