版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学三年级数学《口算除法(1)》教学设计
- 花艺布展协议书
- 逻辑门保真度阈值圆设计规范
- 2026行政能力测试题及答案
- 加湿器喷雾颗粒大小设计规范
- 工程咨询企业内训:人力成本核算优化的价值与路径教学设计
- 化学学习过程(努力、方法)评价试题
- 化学兴趣特长(下学期)发展评估试题
- 2026年芜湖市繁昌区中小学公开聘任退休教师30名笔试参考题库及答案详解
- 污水处理公司设备运行绩效考核管理制度
- GB/T 34010-2026建筑物气密性测定方法风扇压力法
- (完整)2026年全国高校辅导员素质能力大赛基础知识试题+参考答案
- 人力国企笔试题及答案
- 2026-2030中国间苯二甲酰氯(ICL)(CAS-99-63-8)行业市场发展趋势与前景展望战略分析研究报告
- 2026年7月自考06049心理学导论押题及答案
- 2026年C1驾照科目一考试试题及详细答案解析
- 汽车维修汽车故障诊断手册
- 2026年防汛抗旱指挥部办公室面试常见问题及答案解析
- 广告发布三级审批制度
- 应急处置安全指导手册
- 2025年葫芦岛市连山区教师招聘考试真题附答案
评论
0/150
提交评论