volatile在多线程中的应用_第1页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论