
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 俯卧式学习体验中AR技术的创新应用与效果评估
- 医疗培训课程中的动力机制探索
- 构建教育机器人伦理框架的实践与思考
- 智能黑板与交互式教学技术的融合
- 2025年四川省遂宁市船山区二中物理高一第二学期期末学业水平测试试题含解析
- 打破边界偏远区域教育技术新趋势研究
- 2025届广东省惠来一中物理高一下期末统考模拟试题含解析
- 校园心理环境建设与学生潜能开发
- 中职教程课件
- 智慧医疗中教育技术的应用与发展趋势
- 落地式脚手架搭设安全技术交底
- 冠脉造影术后水化治疗
- 急性肝衰竭的护理查房
- 2024年陕西延长石油延安能源化工有限责任公司招聘笔试参考题库含答案解析
- 滴灌通白皮书
- FFR指导下多支血管病变处理策略
- 监控安装项目计划书
- 钓鱼邮件安全对策
- 2024初高中物理衔接 课件
- 劳资专管员学习题165个
- 机电类检验批质量验收记录表
评论
0/150
提交评论