#include <thread> char a,b; void g(){ a=1; } void f(){ b=1; } int main(){ while(true){ a=b=0; std::thread t1(f); std::thread t2(g); t1.join(); t2.join(); if (a!=b){ return 0; } std::chrono::milliseconds dura( 1 ); std::this_thread::sleep_for( dura ); } return 0; }
g()和f()完全访问不同的变量a,b,从单线程角度看,没有任何问题,a永远等于b。
在多线程环境下,a=1,造成一次需要读取一个WORD,这可能连带把与a紧邻的b也读入cache。
b=1也同理。所以,程序一定可以达到a!=b的状态,而正常退出