博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程的坑--volatile
阅读量:6097 次
发布时间:2019-06-20

本文共 1153 字,大约阅读时间需要 3 分钟。

多线程编程中 开优化选项时要谨慎否则容易掉坑里

先看下面的代码,开起两个线程,第二个线程把第一个线程的循环条件置成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;}

转载于:https://blog.51cto.com/13611395/2088655

你可能感兴趣的文章
微信支付签名配置正确,但返回-1,调不出支付界面(有的手机能调起,有的不能)...
查看>>
第二周例行报告
查看>>
Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)...
查看>>
实验八 sqlite数据库操作
查看>>
四种简单的排序算法(转)
查看>>
Quartz2D之着色器使用初步
查看>>
多线程条件
查看>>
Git [remote rejected] xxxx->xxxx <no such ref>修复了推送分支的错误
查看>>
Porter/Duff,图片加遮罩setColorFilter
查看>>
黄聪:VMware安装Ubuntu10.10【图解】转
查看>>
Centos 6.x 升级openssh版本
查看>>
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>