日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于编译器的一个问题

發布時間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于编译器的一个问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天看了下@leekayak 提到的一個問題?http://weibo.com/1465082730/znOSZzU4v

? ???? 我試圖用一個簡單的例子來解釋下,首先看一段更簡單的代碼。


#include "stdio.h" #include "stdlib.h" #include <pthread.h>int f = 0; int x= 0;void* t1(void*) {while(f==0){if(x!=0) printf("error");}return NULL; };void* t2(void*) {x=1;f=1;return NULL; };int main(void) {pthread_t* worker = (pthread_t*) malloc(2*sizeof( pthread_t));pthread_create(&worker[0],NULL,t1,NULL);pthread_create(&worker[1],NULL,t2,NULL);pthread_join(worker[0],NULL);pthread_join(worker[1],NULL);free(worker);return 0;}

我們用-O3 來編譯,就發現問題了。編譯器版本:gcc version 4.7.2 20120921 (Red Hat 4.7.2-2) (GCC)

???

在400788:處發現指令自己jmp到自己(_z2t1pv+0x18) = 400770+18 =? 400788?就死循環了。

這是因為在t1這個函數的局部,看不到f被改變的期望,因此編譯器就自作主張認為f不會變化,等價于死循環,其實這個等價是錯誤的,因為f可能被外部修改。比如t2

?

因此就這個case,將f的定義 加上volatile是一個簡明的法子,volatile int f = 0; 聲明了編譯器不能假設f值會是什么,而是必須去read一下才行。

?

另外的方法就是顯示的加入memory barrier,強制編譯器必須讀取。

while(f==0) { if(x!=0) printf("error"); }

改成

for(__sync_synchronize();f==0;__sync_synchronize())

{

??????? if(x!=0) printf("error");

}


from:?http://blog.csdn.net/pennyliang/article/details/8683391

總結

以上是生活随笔為你收集整理的关于编译器的一个问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。