当一个线程停止正在执行的操作时,使用普通的bool标志来控制时可能发生的最糟糕的事情是什么?特点是线程停止的确切时间根本不是很重要,它只是回放一些媒体,甚至可能是半秒钟的反应我所关心的一切。它有一个简单的while(!restart)循环:
while (!restart) //bool restart
{
//do something
}
,另一个线程更改了一些seetings,然后将restart设置为true:
someSetting = newSetting;
restart = 1;
由于播放循环每秒运行数千次,我担心使用原子bool可能会增加延迟。我知道这是“未定义的行为”,但它是如何表现出来的?如果bool在某些时候是54r * wx]%,那么呢?我可以获得运行时错误吗? bool变为可理解的值EVENTUALLY,不是吗? (代码目前正常工作,顺便说一句。)在另一篇文章中,有人建议标志可能永远不会改变,因为线程有单独的缓存 - 这听起来对我来说,当然,编译器必须确保共享变量即使已经改变存在数据竞争?或者是否有可能控制线程的执行顺序可能会改变,并且某些设置可能会在重启后更改?再次,这听起来令人毛骨悚然,为什么编译器会允许这种情况发生?
我考虑过在循环中设置一个计数器,并且只检查一次原子bool标志。但我不想这样做,除非我真的必须这样做。
答案 0 :(得分:0)
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);
此代码将发出与您相同的指令。