国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

volatile在多線程中的應用

發布時間:2010-8-9 11:04    發布者:lavida
關鍵詞: volatile , 多線程
volatile在詞典中的意思是易變的,反復無常的。它在我們的程序設計中常常用到的。volatile是一個關鍵字,用來修飾一個變量,告訴編譯器在編譯的時候不要對其進行優化,在操作寄存器和多線程中這種用法是最常見的。  

有這樣一個例子:  

#include   
#include   
void 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 create thread:%s\n");  
i = 2;  
while(i == 2);  
printf("main:%d\n",i);  
while(1);  
return 0;?  
}  
void my_func()  
{  
sleep(1);  
i = 3;  
printf("my_func:%d\n",i);  
}  

這個例子本意是想讓主程序進入while(i == 2)這個循環,直到線程中將這變量i的值修改后跳出循環,可是結果是  
my_func:3  
這與想像中的結果完全不一樣,是什么原因造成這樣的結果呢?查看一下匯編代碼,才知道,是編譯器將這段代碼給優化掉了,匯編代碼如下:  

.file "test.c"  
.section .rodata.str1.1,"aMS",@progbits,1  
.LC0:  
.string "my_func:%d\n"  
.text  
.p2align 4,,15  
.globl my_func  
.type my_func, @function  
my_func:  
pushl %ebp  
movl %esp, %ebp  
subl $8, %esp  
movl $1, (%esp)  
call sleep  
movl $3, 4(%esp)  
movl $.LC0, (%esp)  
movl $3, i  
call printf  
leave  
ret  
.size my_func, .-my_func  
.section .rodata.str1.1  
.LC1:  
.string "can't create thread:%s\n"  
.text  
.p2align 4,,15  
.globl main  
.type main, @function  
main:  
leal 4(%esp), %ecx  
andl $-16, %esp  
pushl -4(%ecx)  
pushl %ebp  
movl %esp, %ebp  
pushl %ecx  
subl $36, %esp  
leal -8(%ebp), %eax  
movl $0, 12(%esp)  
movl $my_func, 8(%esp)  
movl $0, 4(%esp)  
movl %eax, (%esp)  
call pthread_create  
testl %eax, %eax  
js .L9  
.L4:  
movl $2, i  
.L6:  
jmp .L6  
.L9:  
movl $.LC1, (%esp)  
call perror  
jmp .L4  
.size main, .-main  
.comm i,4,4  
.ident "GCC: (GNU) 4.1.3 20080623 (prerelease) (Ubuntu 4.1.2-23ubuntu3)"  
.section .note.GNU-stack,"",@progbits  

在定義變量i的時候添加上volatile后:  
int volatile i;  
的結果為:  
my_func:3  
main:3  

這個結果顯然達到了我們預期的效果,再查看一下他的匯編代碼,會看到那個帶有條件的循環語句。  

.file "test.c"  
.section .rodata.str1.1,"aMS",@progbits,1  
.LC0:  
.string "my_func:%d\n"  
.text  
.p2align 4,,15  
.globl my_func  
.type my_func, @function  
my_func:  
pushl %ebp  
movl %esp, %ebp  
subl $8, %esp  
movl $1, (%esp)  
call sleep  
movl $3, i  
movl i, %eax  
movl $.LC0, (%esp)  
movl %eax, 4(%esp)  
call printf  
leave  
ret  
.size my_func, .-my_func  
.section .rodata.str1.1  
.LC1:  
.string "can't create thread:%s\n"  
.LC2:  
.string "main:%d\n"  
.text  
.p2align 4,,15  
.globl main  
.type main, @function  
main:  
leal 4(%esp), %ecx  
andl $-16, %esp  
pushl -4(%ecx)  
pushl %ebp  
movl %esp, %ebp  
pushl %ecx  
subl $36, %esp  
leal -8(%ebp), %eax  
movl $0, 12(%esp)  
movl $my_func, 8(%esp)  
movl $0, 4(%esp)  
movl %eax, (%esp)  
call pthread_create  
testl %eax, %eax  
js .L13  
.L4:  
movl $2, i  
.L6:  
movl i, %eax  
cmpl $2, %eax  
je .L6  
mov i, %eax  
movl $.LC2, (%esp)  
movl %eax, 4(%esp)  
call printf  
.L8:  
jmp .L8  
.L13:  
movl $.LC1, (%esp)  
call perror  
.p2align 4,,3  
jmp .L4  
.size main, .-main  
.comm 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 == 2”編譯器認為i的值是2,沒有變化,認為這個比較沒有意義就將其優化掉了,將程序陷入無條件的死循環中,在線程my_func中修改i 的值夜就沒有意義了,最終結果就是我么看到了那樣了,加上volatile編譯器就不會優化了,每次都被迫去內存中去取值,達到了我們預期的結果。
本文地址:http://www.qingdxww.cn/thread-20227-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 想要避免發生災難,就用MPLAB® SiC電源仿真器!
  • 5分鐘詳解定時器/計數器E和波形擴展!
  • 無線充電基礎知識及應用培訓教程3
  • 了解一下Microchip強大的PIC18-Q24 MCU系列
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久青草网站 | 麻豆国内精品欧美在线 | 国产精品97 | 在线视频久草 | 三级大片免费看 | 成人免费午间影院在线观看 | 男女无遮挡羞羞视频 | 欧美日韩亚 | 欧美日韩精品乱国产 | 200款禁用软件免费下载安卓 | 综合色区| 蜜桃tv在线观看 | 亚洲成人中文 | 在线观看二区三区午夜 | 国内精品 第一页 | 恐怖片免费 | 久草热视频 | 国产亚洲婷婷香蕉久久精品 | 在哪里看黄 | 国产福利免费看 | 狠狠色综合久久久久尤物 | 四虎免费紧急入口2022 | 一级毛片特级毛片免费的 | 自拍 欧美 在线 综合 另类 | 在线观看免费日本 | 四虎永久在线精品视频免费观看 | 午夜国产羞羞视频免费网站 | 成为人视频免费视频播放 | 中文字幕日韩wm二在线看 | 黄免费视频 | 欧美一级成人一区二区三区 | 国产精品久久久久国产精品 | 成人美女免费网站视频 | 日本在线观看不卡 | 国产一级高清视频免费看 | 久久精品视频99 | av在线手机播放 | 成人精品一区二区不卡视频 | 啦啦啦在线观看免费观看4 啦啦啦手机在线播放视频 啦啦啦视频在线视频免费4 | 国产a v高清一区二区三区 | 亚欧免费视频一区二区三区 |