版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、volatile在多线程中的应用volatile在词典中的意思是易变的,反复无常的。它在我们的程序设计中经常用到的。volatile是一个关键字,用来修饰一个变量,告知编译器在编译的时候不要对其举行优化,在操作寄存器和多线程中这种使用是最频繁的。有这样一个例子:includeincludevoid my_func();int? i;int main()pthread_t my_thread;int err,k;if (err = pthread_create(&my_thread,null,(void *)my_func,null)perror("can't crea
2、te thread:%sn");i = 2;while(i = 2);printf("main:%dn",i);while(1);return 0;?void my_func()sleep(1);i = 3;printf("my_func:%dn",i);这个例子本意是想让主程序进入while(i = 2)这个循环,直到线程中将这变量i的值修改后跳出循环,可是结果是my_func:3这与想像中的结果彻低不一样,是什么缘由造成这样的结果呢?查看一下汇编代码,才知道,是编译器将这段代码给优化掉了,汇编代码如下:.file "test.c&
3、quot;.section .rodata.str1.1,"ams",progbits,1.lc0:.string "my_func:%dn".text.p2align 4,15.globl my_func.type my_func, functionmy_func:pushl %ebpmovl %esp, %ebpsubl $8, %espmovl $1, (%esp)call sleepmovl $3, 4(%esp)movl $.lc0, (%esp)movl $3, icall printfleaveret.size my_func, .-my_
4、func.section .rodata.str1.1.lc1:.string "can't create thread:%sn".text.p2align 4,15.globl main.type main, functionmain:leal 4(%esp), %ecxandl $-16, %esppushl -4(%ecx)pushl %ebpmovl %esp, %ebppushl %ecxsubl $36, %espleal -8(%ebp), %eaxmovl $0, 12(%esp)movl $my_func, 8(%esp)movl $0, 4(%e
5、sp)movl %eax, (%esp)call pthread_createtestl %eax, %eaxjs .l9.l4:movl $2, i.l6:jmp .l6.l9:movl $.lc1, (%esp)call perrorjmp .l4.size main, .-m i,4,4.ident "gcc: (gnu) 4.1.3 20080623 (prerelease) ( 4.1.2-23ubuntu3)".section .note.gnu-stack,"",progbits在定义变量i的时候添加上volatile后:i
6、nt volatile i;的结果为:my_func:3main:3这个结果明显达到了我们预期的效果,再查看一下他的汇编代码,会看到那个带有条件的循环语句。.file "test.c".section .rodata.str1.1,"ams",progbits,1.lc0:.string "my_func:%dn".text.p2align 4,15.globl my_func.type my_func, functionmy_func:pushl %ebpmovl %esp, %ebpsubl $8, %espmovl $1, (%
7、esp)call sleepmovl $3, imovl i, %eaxmovl $.lc0, (%esp)movl %eax, 4(%esp)call printfleaveret.size my_func, .-my_func.section .rodata.str1.1.lc1:.string "can't create thread:%sn".lc2:.string "main:%dn".text.p2align 4,15.globl main.type main, functionmain:leal 4(%esp), %ecxandl
8、$-16, %esppushl -4(%ecx)pushl %ebpmovl %esp, %ebppushl %ecxsubl $36, %espleal -8(%ebp), %eaxmovl $0, 12(%esp)movl $my_func, 8(%esp)movl $0, 4(%esp)movl %eax, (%esp)call pthread_createtestl %eax, %eaxjs .l13.l4:movl $2, i.l6:movl i, %eaxcmpl $2, %eaxje .l6mov i, %eaxmovl $.lc2, (%esp)movl %eax, 4(%es
9、p)call printf.l8:jmp .l8.l13:movl $.lc1, (%esp)call perror.p2align 4,3jmp .l4.size main, .-m i,4,4.ident "gcc: (gnu) 4.1.3 20080623 (prerelease) (ubuntu 4.1.2-23ubuntu3)".section .note.gnu-stack,"",progbits比较红色部分就会看到是什么造成这种差异了!为什么加上volatile和不加就有这么大的差距的,缘由是每次用法变量都去内存中取值,然后通过系统传到cpu处理,会增强很大的开销,所以在cpu的cache中位变量啊做了一个副本,通过这个副原来举行赋值。在程序中首先对i 举行复制“i = 2”,然后又将i和2举行比较“i =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年池州市青阳县保安员(协警)招聘考试题库附答案解析
- 《新型冠状病毒肺炎康复后肺功能恢复的康复治疗与护理一体化模式构建与应用》教学研究课题报告
- 电工(高级)资格证考试题库检测题型附完整答案详解(易错题)
- 2025年思茅市景东县留置保安员笔试真题附答案解析
- 2026年兰州职业技术学院高职单招职业适应性考试备考试题及答案详解
- 高中数学教学中深度学习在图像生成中的应用课题报告教学研究课题报告
- 初中地理教师教学画像与激励策略优化教学研究课题报告
- 2026年辽宁城市建设职业技术学院单招职业技能笔试备考试题及答案详解
- 区域教育课程资源均衡开发中人工智能技术资源质量控制与评价体系构建教学研究课题报告
- 2026年上海工程技术大学单招职业技能笔试备考题库及答案详解
- 纺织公司“十五五”发展规划(2025-2025 年)
- 江苏省常州市2024-2025学年高一年级上册期末质量调研物理试卷(解析版)
- 药厂述职报告
- 资源与运营管理-第一次形考任务-国开-参考资料
- 电源适配器检验作业指导
- 病理检验技术(第3版)课件 第10章 细胞学检查技术
- 部编本语文五年级上册全册课内句子训练带答案
- DL∕T 1938-2018 垃圾发电厂炉渣处理技术规范
- 2022年华东师范大学公共课《马克思主义基本原理概论》期末试卷B(有答案)
- 六年级上册生命生态安全教案及教学计划
- 新生儿科进修总结汇报
评论
0/150
提交评论