2013-03-23 57 views
1

在x86_64体系结构上,是否以下代码将始终保留:x86_64内存重新排序

A = 1; B = 1;

Thread1:store A = 2;存储B = 3; 线程2:加载B == 3;负载A == 2

有没有任何pos === B == 3但A == 1?

回答

3

卷3A和英特尔架构手册3B章8.2.3进入非常深入的关于这个问题,但是,对于你的情况(8.2.3.7 Stores Are Seen in a Consistent Order by Other Processors),有严格的顺序,这意味着写操作的顺序观察这它们被制成,使得B不可能读取更新的值,而A仍旧具有旧值。

应当指出的是,它通常是一个好主意通过使用各种内存栅栏指令可用,SFENCELFENCE & MFENCE通过_mm_sfence提供在这样的情况下明确的障碍,_mm_lfence & _mm_mfence。在x64下,您还可以选择__faststorefence(仅适用于MSVC)。

+0

此前我也在翻阅intel架构的第8.2.3章,不同的部分是读/写序列在两个线程中是相同的。我感到困惑的是:如果线程2在进程中运行的服务器的内存系统使得队列无序失效,那么意外情况会发生? – foxmailed 2013-03-23 07:05:37

+0

@foxmailed:thats其中'8.2.3.2加载或不加载存储器与类似操作'进来,它的例子完全描述你的情况:'只有当处理器0的两个存储器被重新排序( )时才能展示不允许的返回值两个负载发生在它们之间)或者如果处理器1的两个负载 被重新排序(两个存储在它们之间发生)。在这种情况下,您需要通过使用原子或内存屏障来确保总体顺序。 – Necrolis 2013-03-25 19:33:15