使用非原子布尔时的不确定行为
Undefined behaviour when using a non-atomic bool
当一个线程停止在做什么时,使用普通的布尔标志来控制时会发生什么最糟糕的事情?特殊性是,线程停止的确切时间根本不是很重要,它只是播放一些媒体,甚至在为我所关心的一切做出反应时,它甚至可能是半秒。它具有简单的(!restart)循环:
while (!restart) //bool restart
{
//do something
}
,另一个线程更改了一些光,然后将重新启动重新启动到true:
someSetting = newSetting;
restart = 1;
由于播放循环每秒运行数千次,因此我担心使用原子布尔可能会增加延迟。我知道这是"不确定的行为",但是这如何表现出来?如果Bool在某个时候是54r*wx]%,那又如何?我可以得到运行时错误吗?最终,布尔更改为可理解的价值,不是吗?(代码目前有效,顺便说一句。)在另一篇文章中,有人建议该标志可能永远不会更改,因为这些线程具有单独的缓存 - 对我来说,这听起来很听起来,而且编译器肯定必须确保即使共享变量也会更改,即使存在数据竞赛吗?还是可能会更改控制线程的执行顺序,并且在重新启动后可能会更改序列?再次,这听起来很令人毛骨悚然,为什么编译器会允许这种情况发生?
我考虑过在循环内设置一个计数器,并仅每千次检查一次原子布尔标志。但是我不想这样做,除非我真的必须这样做。
ub并不意味着您的代码不起作用,这只是意味着您的代码行为并未由标准指定。您必须使用std::atomic
来使您的代码标准标准不实际改变行为。您可以使用memory_order_relaxed
:
atomic<int> restart ....
while (!restart.load(memory_order_relaxed))
{
//do something
}
在另一个线程中:
someSetting = newSetting;
restart.store(1, memory_order_relaxed);
此代码将发布与您的说明相同的说明。
相关文章:
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 条件断点在不应该触发时触发
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 不确定如何装饰我的C++库代码以在 C 中使用
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- C++功能泄漏内存,我是C++新手,不确定如何解决
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 不使用configure_file时如何使用CMake生成C++代码?
- 我不确定为什么代码没有运行,它在编译时抛出错误,说它无法找到 PrintArray()
- 在C++中做一个场景问题,我不确定如何处理布尔和if循环
- 实例化部分模板规格的别名时,不确定模板的隐式实例化
- 不确定我在阅读文本文件时的问题是什么
- 在我的代码覆盖本身时遇到麻烦,我不确定为什么
- 当constexpr评估负面bitshift时,不确定的行为
- 当包含具有虚拟方法的标头时,不确定如何在.cpp文件中设置方法
- 使用非原子布尔时的不确定行为
- C++不确定类型时投射 void*
- 当我不确定输入是什么时,使用什么变量?
- 试图在矢量中找到某些东西时出错,不确定如何修复