我试图编写一些代码来观察内存操作的重新排序。
在下面的示例中,我预计在 set_values() 的某些执行中,分配值的顺序可能会发生变化。特别是 notification = 1 可能发生在其余操作之前,但即使在数千次迭代之后也不会发生。我用 -O3 优化编译了代码。这是我指的 youtube 材料:https ://youtu.be/qlkMbxUbKfw?t=200
int a{0};
int b{0};
int c{0};
int notification{0};
void set_values()
{
a = 1;
b = 2;
c = 3;
notification = 1;
}
void calculate()
{
while(notification != 1);
a += b + c;
}
void reset()
{
a = 0;
b = 0;
c = 0;
notification = 0;
}
int main()
{
a=6; //just to allow first iteration
for(int i = 0 ; a == 6 ; i++)
{
reset();
std::thread t1(calculate);
std::thread t2(set_values);
t1.join();
t2.join();
std::cout << "Iteration: " << i << ", " "a = " << a << std::endl;
}
return 0;
}
现在程序陷入无限循环。我希望在某些迭代中 set_values() 函数中的指令顺序可以改变(由于现金内存的优化)。例如 notification = 1 将在 c = 3 之前执行什么将触发执行 calculate() 函数并给出 a==3 什么满足终止循环的条件并证明重新排序
或者也许有人可以提供其他简单的代码示例来帮助观察内存操作的重新排序?