x86内存排序测试显示英特尔手册中不应该有的重新排序?



根据英特尔手册。加载和存储都不使用类似操作进行重新排序根据8.2.3.2装载和储存均未采用类似操作进行重新排序

at文档https://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html在此处输入图像描述

但我创建了一个简单的案例,我发现r1=1和r2=2发生了。

#include <thread>
#include <iostream>
using namespace std;
volatile int x;
int b[500];
volatile int y;
volatile int start;
int s1;
int s2;
int s3;
int s0;
int foo()
{
while(start==0);
x=1;
asm volatile("" ::: "memory");
y=1;
return 0;
}
int fool2()
{
int a,b;
while(start==0);
a=x;
asm volatile("" ::: "memory");
b=y;
if(a==0 && b==1)
s0++;
if(a==0 && b==0)
s1++;
if(a==1 && b==0)
s2++;
if(a==1 && b==1)
s3++;
return 0;
}
int main()
{
int i=0;
while(1)
{
x=y=0;
thread t1(foo);
thread t2(fool2);
start = 1;
t1.join();
t2.join();
i++;
if((i&0xFFFF)==0)
{
cout<<s0<<" "<<s1<<" "<<s2<<" "<<s3<<endl;
}
}
}

g++-O2-pthread e.cpp

gcc 7.5.0版

输出:

69 86538 1 19246512

四种情况(r1和r2的组合为0,1(都是可能的。

仔细查看英特尔手册第8.2.3.2节。在你的例子中,你正在有效地做:

处理器1mov[_x],1mov r2,_xmov[_y],1

相关内容

  • 没有找到相关文章

最新更新