单处理器上的单写程序内存可见性保证

时间:2012-05-09 17:42:59

标签: c++ multithreading

对于以下C ++代码

volatile bool keepRunning = true;

void run() {
    while (keepRunning) {
        doSomeWork();
    }
}

void stop() {
    keepRunning = false;
}

假设一个线程执行stop()并且多个线程正在执行run()

我相信这种构造(一个编写器,没有同步原语)在嵌入式系统中非常普遍。假设没有多个处理器/核心,这是否可以保证正常工作?

由于

2 个答案:

答案 0 :(得分:1)

不,代码中不会强加内存障碍,因此编译器可以自由地使用非易失性访问重新排序易失性访问,这可能会导致错误的行为。 '挥发性'与多线程无关,有关更多信息,请查看Arch Robison's blog post

如果这是一个单独的CPU平台或多个CPU平台,这也无关紧要,如果代码正确,那么store-with-release将通过缓存一致性协议传播到其他CPU /线程,一切都会好的。

答案 1 :(得分:0)

是的,因为在unicore机器上只有一个CPU和一个CPU缓存。

另一个原因:对于CPU,看起来只有一个线程在运行。 CPU有义务向应用程序提供一个内存视图,这相当于单线程执行,因为CPU甚至不能告诉它有多个线程。