【问题标题】:x86_64 memory reorderx86_64 内存重新排序
【发布时间】:2013-03-23 05:37:00
【问题描述】:

在 x86_64 架构上,以下代码是否会一直保持:

A=1;B=1;

Thread1 : 存储 A=2;商店 B=3; 线程2:加载B==3;加载 A==2

是否存在 B==3 但 A==1 的可能性??

【问题讨论】:

    标签: concurrency x86-64 memory-model


    【解决方案1】:

    英特尔架构手册第 3A 卷和第 3B 卷的第 8.2.3 章对此主题进行了深入探讨,但是,对于您的情况 (8.2.3.7 Stores Are Seen in a Consistent Order by Other Processors),有严格的顺序,这意味着按照以下顺序观察写入它们是制造出来的,这使得B 无法读取更新后的值,而A 仍然具有旧值。

    应该注意的是,在这种情况下,通过使用各种可用的内存隔离指令SFENCE、LFENCE 和MFENCE 通过_mm_sfence、_mm_lfence 和_mm_mfence。在 x64 下,您还可以选择 __faststorefence(仅限 MSVC)。

    【讨论】:

    • 之前我也读过intel架构的第8.2.3章,不同的是两个线程的读/写顺序是一样的。我感到困惑的是:如果线程2在进程中运行的服务器的内存系统乱序使队列无效,那么会发生意外情况吗?
    • @foxmailed:这就是8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations 的用武之地,它的示例准确地描述了您的场景:The disallowed return values could be exhibited only if processor 0’s two stores are reordered (with the two loads occurring between them) or if processor 1’s two loads are reordered (with the two stores occurring between them). 在这种情况下,您需要使用我提到的原子屏障或内存屏障来确保总顺序。
    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2019-01-01
    • 1970-01-01
    • 2013-10-29
    • 2014-10-11
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多