国产毛片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://m.qingdxww.cn/thread-20227-1-1.html     【打印本頁】

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

廠商推薦

  • Microchip視頻專區
  • 想要避免發生災難,就用MPLAB® SiC電源仿真器!
  • 5分鐘詳解定時器/計數器E和波形擴展!
  • 無線充電基礎知識及應用培訓教程3
  • 了解一下Microchip強大的PIC18-Q24 MCU系列
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美影片网站推荐 | 欧美在线视频免费看 | 性福宝丝瓜视频下载 | 在线色av | eeuss影院在线观看第一页 | 日韩国产精品视频 | 婷婷久月 | 在线观看91精品国产性色 | 一级做a爰视频免费观看2019 | 国产精品免费大片一区二区 | 无遮挡羞羞视频 | 日韩在线观看一区二区不卡视频 | 亚洲成a人片在线观看导航 亚洲成a人片77777老司机 | 日本二区视频 | 欧美日韩在线观看一区二区 | 亚洲高清一区二区三区久久 | 亚洲欧洲一区二区三区在线观看 | 韩国一级伦理片 | 国产欧美日韩一区二区三区 | 久久99精品综合国产首页 | 黄色在线观看视频免费 | 国产精品青青 | 欧美69精品国产成人 | 在线天堂网| 欧美日韩精选 | 欧美色欧美亚洲高清在线视频 | 婷婷香蕉 | 四虎在线永久精品高清 | 在线看片日本 | 日产国产欧美视频一区精品 | 亚洲六月丁香色婷婷综合久久 | 麻豆精品传媒一二三区在线视频 | 国产精品视频久久 | 中文字幕日韩一区二区三区不卡 | 国产精品日韩欧美一区二区三区 | 国产精品视频分类 | 四虎影视在线看免费观看 | 国产99网站| 四虎影视app| 黄视频免费网站 | 91新网址 |