对于以下C ++代码
volatile bool keepRunning = true;
void run() {
while (keepRunning) {
doSomeWork();
}
}
void stop() {
keepRunning = false;
}
假设一个线程执行stop()并且多个线程正在执行run()
我相信这种构造(一个编写器,没有同步原语)在嵌入式系统中非常普遍。假设没有多个处理器/核心,这是否可以保证正常工作?
由于
答案 0 :(得分:1)
不,代码中不会强加内存障碍,因此编译器可以自由地使用非易失性访问重新排序易失性访问,这可能会导致错误的行为。 '挥发性'与多线程无关,有关更多信息,请查看Arch Robison's blog post。
如果这是一个单独的CPU平台或多个CPU平台,这也无关紧要,如果代码正确,那么store-with-release将通过缓存一致性协议传播到其他CPU /线程,一切都会好的。
答案 1 :(得分:0)
是的,因为在unicore机器上只有一个CPU和一个CPU缓存。
另一个原因:对于CPU,看起来只有一个线程在运行。 CPU有义务向应用程序提供一个内存视图,这相当于单线程执行,因为CPU甚至不能告诉它有多个线程。