x86上的竞争条件

Ati*_*ion 24 c c++ x86 race-condition

有人可以解释这句话:

shared variables
x = 0, y = 0

Core 1       Core 2
x = 1;       y = 1;
r1 = y;      r2 = x;
Run Code Online (Sandbox Code Playgroud)

怎么可能有r1 == 0r2 == 0x86处理器?

来源"并发的语言"通过巴尔托什卢斯基.

Gro*_*roo 27

由于涉及重新排序指令的优化,可能会出现问题.换句话说,两个处理器可以分配r1r2 之前分配的变量xy,如果他们发现,这将产生更好的性能.这可以通过添加内存屏障来解决,这将强制执行排序约束.

引用你在帖子中提到的幻灯片:

现代多核/语言打破了顺序一致性.

关于x86架构,最佳资源是英特尔®64和IA-32架构软件开发人员手册(第8.2内存排序).8.2.1和8.2.2节描述了由Intel486,Pentium,Intel Core 2 Duo,Intel Atom,Intel Core Duo,Pentium 4,Intel Xeon和P6系列处理器实现的内存排序:称为处理器排序的内存模型,如反对较旧的Intel386架构的程序排序(强排序)(其中读和写指令总是按照它们出现在指令流中的顺序发出).

该手册描述了处理器订购内存模型的许多订购保证(例如,负载不与其他负载重新排序,存储不与其他存储重新排序,存储不与旧负载重新排序等),但它还描述了允许的重新排序规则这导致了OP的帖子中的竞争条件:

8.2.3.4载荷可以与较早的商店重新排序到不同的地点

另一方面,如果切换了指令的原始顺序:

shared variables
x = 0, y = 0

Core 1       Core 2
r1 = y;      r2 = x;
x = 1;       y = 1;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,处理器保证不允许r1 = 1r2 = 1不允许这种情况(由于8.2.3.3存储没有按照早期负载保证重新排序),这意味着这些指令永远不会在单个核心中重新排序.

要将其与不同的体系结构进行比较,请查看本文:现代微处理器中的内存排序(具体为此图像).您可以看到Itanium(IA-64)比IA-32架构更加重新排序.