相关疑难解决方法(0)

C++ 0x内存模型和推测性加载/存储

所以我正在阅读作为即将推出的C++ 0x标准一部分的内存模型.但是,我对允许编译器做什么的一些限制有点困惑,特别是关于推测性加载和存储的限制.

首先,一些相关的东西:

Hans Boehm关于线程和C++ 0x中的内存模型的页面

Boehm,"线程无法实现为库"

Boehm和Adve,"C++并发内存模型的基础"

Sutter,"Prism:基于原理的Microsoft本地代码平台的顺序存储模型",N2197

Boehm,"并发内存模型编译后果",N2338

现在,基本思想本质上是"数据无竞赛程序的顺序一致性",这似乎是编程简易性和允许编译器和硬件优化机会之间的妥协.如果不对不同线程对相同存储器位置的两次访问进行排序,则至少有一个存储到存储器位置,并且它们中的至少一个不是同步动作,则定义数据争用.这意味着对共享数据的所有读/写访问必须通过某些同步机制,例如互斥体或对原子变量的操作(嗯,可以对原子变量进行操作,只为专家提供放松的内存排序,但默认提供为顺序一致).

鉴于此,我对普通共享变量上的虚假或推测性加载/存储的限制感到困惑.例如,在N2338中我们有例子

switch (y) {
    case 0: x = 17; w = 1; break;
    case 1: x = 17; w = 3; break;
    case 2: w = 9; break;
    case 3: x = 17; w = 1; break;
    case 4: x = 17; w = 3; break;
    case 5: x = 17; w = 9; break;
    default: x = 17; w = 42; break;
}
Run Code Online (Sandbox Code Playgroud)

不允许编译器转换为

tmp = …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency memory-model compiler-optimization c++11

24
推荐指数
2
解决办法
3811
查看次数