从品牌网站建设到网络营销策划,从策略到执行的一站式服务
多线程编程中 开优化选项时要谨慎否则容易掉坑里
先看下面的代码,开起两个线程,第二个线程把第一个线程的循环条件置成false 按逻辑来说这个应该能顺利结束的不过如果用
g++ -O3 -o multiThread multiThread.cpp -lpthread
编译的话TestThread1是退不出来的,只有 g_brun 加上 volatile关键字才能正常退出
因为在-O3优化选项下 执行TestThread1时g_brun会先读到寄存器中,编译器发现这个函数中g_brun没有任何改变所以不会再去内存中取值直接用寄存器中的备份,在TestThread2中改变了g_brun在内存中的值,对TestThread1中g_brun的寄存器备份没有任何影响。
加上volatile表示对该变量不优化每次都去内存中取值。
#include
#include
#include
using namespace std;
//volatile bool g_brun = true;
bool g_brun = true;
void* TestThread1(void* arg)
{
cout << "TestThread1 进入" << endl;
long long ll = 0;
while(g_brun)
ll ++;
cout << "TestThread1 退出 ll:" << ll << endl;
}
void* TestThread2(void* arg)
{
cout << "TestThread2 进入" << endl;
g_brun = false;
cout << "TestThread2 退出 设置 g_brun = false" << endl;
}
int main()
{
pthread_t threadId1;
pthread_create(&threadId1, NULL, TestThread1, NULL);
usleep(1000000); // 保证TestThread1先执行
pthread_t threadId2;
pthread_create(&threadId2, NULL, TestThread2, NULL);
pthread_join(threadId1,NULL);
pthread_join(threadId2,NULL);
return 0;
}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220
成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有.
专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图