使用非原子布尔时的不确定行为

Undefined behaviour when using a non-atomic bool

本文关键字:不确定 布尔时      更新时间:2023-10-16

当一个线程停止在做什么时,使用普通的布尔标志来控制时会发生什么最糟糕的事情?特殊性是,线程停止的确切时间根本不是很重要,它只是播放一些媒体,甚至在为我所关心的一切做出反应时,它甚至可能是半秒。它具有简单的(!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);

此代码将发布与您的说明相同的说明。