使用非原子bool时的未定义行为

时间:2014-01-28 16:14:58

标签: c++ windows multithreading visual-studio-2013

当一个线程停止正在执行的操作时,使用普通的bool标志来控制时可能发生的最糟糕的事情是什么?特点是线程停止的确切时间根本不是很重要,它只是回放一些媒体,甚至可能是半秒钟的反应我所关心的一切。它有一个简单的while(!restart)循环:

while (!restart) //bool restart
{ 
    //do something
}

,另一个线程更改了一些seetings,然后将restart设置为true:

someSetting = newSetting;
restart = 1;

由于播放循环每秒运行数千次,我担心使用原子bool可能会增加延迟。我知道这是“未定义的行为”,但它是如何表现出来的?如果bool在某些时候是54r * wx]%,那么呢?我可以获得运行时错误吗? bool变为可理解的值EVENTUALLY,不是吗? (代码目前正常工作,顺便说一句。)在另一篇文章中,有人建议标志可能永远不会改变,因为线程有单独的缓存 - 这听起来对我来说,当然,编译器必须确保共享变量即使已经改变存在数据竞争?或者是否有可能控制线程的执行顺序可能会改变,并且某些设置可能会在重启后更改?再次,这听起来令人毛骨悚然,为什么编译器会允许这种情况发生?

我考虑过在循环中设置一个计数器,并且只检查一次原子bool标志。但我不想这样做,除非我真的必须这样做。

1 个答案:

答案 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);

此代码将发出与您相同的指令。