我不信就分了两个函数,编译器就蠢到优化成只读。这就是未定义形为,编译器想怎么实现就怎么实现。
【 在 libgcc 的大作中提到: 】
: #include<stdio.h>
: #include<string>
: #include<atomic>
: #include<thread>
: #include<chrono>
: usingnamespacestd;
: inttag=0;
: voidfunc1()
: {
: std::this_thread::sleep_for(chrono::milliseconds(100));
: tag=1;
: //std::atomic_thread_fence(std::memory_order_relaxed);
: }
: voidfunc2()
: {
: while(tag==0);
: //std::atomic_thread_fence(std::memory_order_relaxed);
: }
: intmain()
: {
: threadt1(func1);
: threadt2(func2);
: t1.join();
: printf("t1joined........\n");
: t2.join();
: printf("finished........\n");
: return0;
: }
: g++a.cpp-O2-std=c++11-pthread&&./a.out
: 程序挂住了
: 不开-O2不会挂住,加上volatile不会挂住,加上fence也不会挂住
※ 来源:·
https://exp.newsmth.net·[FROM: 73.63.211.*]
FROM 73.63.211.*