#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的状态,而正常退出
本文通过一个简单的C++多线程程序示例探讨了多线程环境下的内存一致性问题。程序包含两个线程,分别修改不同的变量a和b。理论上,这两个变量互不影响,但在实际运行中由于缓存一致性可能会导致变量状态不一致的情况发生。
919

被折叠的 条评论
为什么被折叠?



