Concurrency x86_64内存重新排序

Concurrency x86_64内存重新排序,concurrency,x86-64,memory-model,Concurrency,X86 64,Memory Model,在x86_64体系结构上,以下代码是否始终有效: A=1;B=1 线程1:存储A=2;B=3; 螺纹2:负载B==3;加载A==2 《英特尔体系结构手册》第3A卷和第3B卷第8.2.3章对此问题进行了深入探讨,但是,对于您的情况(8.2.3.7存储被其他处理器以一致的顺序看到),有严格的顺序,这意味着写入操作是按照写入顺序进行的,这使得B无法读取更新的值,而A仍然具有旧值 应该注意的是,在这种情况下,通过使用各种可用的内存围栏指令,SFENCE,LFENCE和MFENCE通过\um\u SFEN

在x86_64体系结构上,以下代码是否始终有效:

A=1;B=1

线程1:存储A=2;B=3; 螺纹2:负载B==3;加载A==2


《英特尔体系结构手册》第3A卷和第3B卷第8.2.3章对此问题进行了深入探讨,但是,对于您的情况(
8.2.3.7存储被其他处理器以一致的顺序看到),有严格的顺序,这意味着写入操作是按照写入顺序进行的,这使得
B
无法读取更新的值,而
A
仍然具有旧值


应该注意的是,在这种情况下,通过使用各种可用的内存围栏指令,
SFENCE
LFENCE
MFENCE
通过
\um\u SFENCE
mm\u LFENCE
提供显式屏障通常是个好主意。在x64下,您还可以选择
\uu faststoreffence
(仅限MSVC)。

之前我还阅读了英特尔体系结构第8.2.3章,不同的部分是读/写顺序在两个线程中相同。我所困惑的是:如果线程2在进程中运行的服务器的内存系统使队列无序失效,那么就会发生意外情况?@foxmailed:that's
8.2.3.2既不加载也不存储都不会用类似的操作重新排序,其示例准确地描述了您的场景:
仅当处理器0的两个存储被重新排序(两个加载发生在它们之间)或处理器1的两个加载被重新排序(两个存储发生在它们之间)时,才能显示不允许的返回值.
在这种情况下,您需要使用我提到的原子或内存屏障来确保总顺序。