1.volatile有什么用呢?
volatile,只一個變量可能隨時由于外界地變化而變化
例如有兩個線程分別是線程1和線程2
一個全局變量volatile int i = 0;
線程1
執行如下代碼
while(i == 0);
printf();
假設線程1執行到 while處,就會反復執行上這條語句
此時線程2執行
i = 1;
線程1就會執行 printf()
若沒有指定 int i 為 volatile
則當線程2執行 i = 1;
時,線程1仍然繼續執行while語句
也就是說線程1沒有感知變量i的變化
這是由于編譯器會對代碼進行優化,以及將i
變量裝入寄存器的原因,當i再內存中的值發生變化時
無法判斷在那個寄存器中有該變量的拷貝,而且不能
同步更新該拷貝
因此需要說明該變量為volatile
這樣,編譯器不會將該變量裝入寄存器,而且不會對
涉及該變量的操作進行優化.
下面有個更理論性的解釋:
volatile總是與優化有關,編譯器有一種技術叫做數據流分析,分析程序中的變量在哪里賦值、在哪里使用、在哪里失效,分析結果可以用于常量合并,常
量傳播等優化,進一步可以死代碼消除。但有時這些優化不是程序所需要的,這時可以用volatile關鍵字禁止做這些優化,volatile的字面含義是
易變的,它有下面的作用:
1 不會在兩個操作之間把volatile變量緩存在寄存器中。在多任務、中斷、甚至setjmp環境下,變量可能被其他的程序改變,編譯器 自己無法知道,volatile就是告訴編譯器這種情況。
2 不做常量合并、常量傳播等優化,所以像下面的代碼:
volatile int i = 1;
if (i > 0) ...
if的條件不會當作無條件真。
3 對volatile變量的讀寫不會被優化掉。如果你對一個變量賦值但后面沒用到,編譯器常??梢允÷阅莻€賦值操作,然而對Memory Mapped IO的處理是不能這樣優化的。
前面有人說volatile可以保證對內存操作的原子性,這種說法不大準確,其一,x86需要LOCK前綴才能在SMP下保證原子性,其二,RISC根本不能對內存直接運算,要保證原子性得用別的方法,如atomic_inc。
對于jiffies,它已經聲明為volatile變量,我認為直接用jiffies++就可以了,沒必要用那種復雜的形式,因為那樣也不能保證原子性。
你可能不知道在Pentium及后續CPU中,下面兩組指令
inc jiffies
;;
mov jiffies, %eax
inc %eax
mov %eax, jiffies
作用相同,但一條指令反而不如三條指令快。
只有注冊用戶登錄后才能發表評論。 | ||
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
![]() |
||
相關文章:
|
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
26 | 27 | 28 | 29 | 30 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 30 | |||
31 | 1 | 2 | 3 | 4 | 5 | 6 |
常用鏈接
留言簿(10)
隨筆分類(307)
- Algorithm(22)
- apache(1)
- Assembly(1)
- browser(2)
- C++_BASIS(39)
- Compiling Theorem(1)
- CPU(1)
- cvs(3)
- Database(8)
- Designed Patterns(3)
- FileFormat(4)
- FileSystem(1)
- freebsd(1)
- Game(2)
- gdb(1)
- Gossips(12)
- GP_STL(3)
- interview(8)
- java
- life and living(1)
- linux kernel(12)
- Linux_Coding(43)
- Linux_Driver
- Linux_SysAdmin(26)
- makefile(3)
- misce(5)
- MultiCore(1)
- Network(14)
- OS(18)
- RegularExpression(1)
- schedule(1)
- SearchEngine(1)
- security(2)
- Shell(25)
- Socket(18)
- storage(2)
- Template(4)
- VC_MFC(4)
- vi(5)
- website(1)
- windows(7)
隨筆檔案(297)
- 2012年10月 (1)
- 2012年9月 (1)
- 2012年7月 (1)
- 2012年6月 (7)
- 2012年5月 (3)
- 2012年4月 (2)
- 2011年9月 (3)
- 2011年8月 (3)
- 2011年6月 (3)
- 2011年5月 (2)
- 2011年3月 (2)
- 2011年1月 (1)
- 2010年12月 (2)
- 2010年11月 (6)
- 2010年10月 (4)
- 2010年9月 (7)
- 2010年8月 (12)
- 2010年7月 (6)
- 2010年6月 (5)
- 2010年5月 (11)
- 2010年4月 (16)
- 2010年3月 (20)
- 2010年2月 (18)
- 2010年1月 (26)
- 2009年12月 (34)
- 2009年11月 (36)
- 2009年10月 (5)
- 2009年9月 (1)
- 2009年7月 (2)
- 2009年6月 (3)
- 2009年5月 (6)
- 2009年4月 (6)
- 2009年3月 (11)
- 2009年2月 (6)
- 2008年11月 (1)
- 2008年10月 (1)
- 2008年9月 (3)
- 2008年8月 (4)
- 2008年7月 (16)
algorithm
- andytan
- algorithm, linux, os, network,etc
- EXACT STRING MATCHING ALGORITHMS
- httperf -- a web perf test tool
- Java多線程
- 編程夜未眠
- 布薩空間
- 結構之法
- 沈一峰 google技術博客
- 小兵的窩
Books_Free_Online
C++
- Bjarne Stroustrup's C++ Style and Technique FAQ
- boyplayee column
- C Plus Plus
- CPP Reference
- LearnC++Website
- Welcome to Bjarne Stroustrup's homepage!
database
Linux
Linux shell
linux socket
misce
- cloudward
- 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的
network
OSS
- Google Android
- Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
- os161 file list
overall
搜索
最新評論

- 1.?re: memcached完全剖析系列教程《轉》
- mark
- --zgpxgame
- 2.?re: 用prctl給線程命名
- 評論內容較長,點擊標題查看
- --none
- 3.?re: 用prctl給線程命名
- 請問大俠: 用top命令的時候可以顯示修改后的線程名么?如何做呢?
- --dhao123@sina.com
- 4.?re: 解決Linux pthread_create內存泄漏問題
-
我試過,每一種方法有的時候不行。
第二種是可以的。
- --朱先生
- 5.?re: 著名程序庫的比較和學習經驗
- 評論內容較長,點擊標題查看
- --buy dissertation
- 6.?re: linux的消息隊列與共享內存編程
- 內容選擇得很好,謝謝
- --朱志超
- 7.?re: 著名程序庫的比較和學習經驗
- 評論內容較長,點擊標題查看
- --LillianHancock
- 8.?re: 解決Linux pthread_create內存泄漏問題[未登錄]
- 不錯,支持一個。
- --jack
- 9.?re: 淺談游戲服務器---功能模塊上來看[未登錄]
- 不錯 好文!! 期待博主繼續
- --cppexplore
- 10.?re: 全面整理的C++面試題
- 評論內容較長,點擊標題查看
- --chatler
- 11.?re: 微軟面試中簡單的算法題目(轉)
- 評論內容較長,點擊標題查看
- --chatler
- 12.?re: Browsers, processes, cookies and session state
- 每個IE Instance該是不同的進程吧,可以獲取進程ID,在每個instance里建一個名稱包含進程id的目錄名,就可以分目錄存儲了吧。
- --chatler
- 13.?re: Browsers, processes, cookies and session state
-
文章說的很清楚,多謝
我有一個問題:
如何為每個ie instance ie實例的 Persistent cookies cookie 指定不同的存儲目錄? - --domolo
- 14.?re: 從一道面試題看指針與數組的區別
- 一個字,強!
- --路過
- 15.?re: 一個關于單向鏈表的面試題
- 評論內容較長,點擊標題查看
- --chatler
閱讀排行榜
- 1.?Windows Socket五種I/O模型(8339)
- 2.?最大公約數(Gcd)兩種算法(Euclid && Stein)<轉>(5497)
- 3.?用prctl給線程命名(5056)
- 4.?Linux core dump file詳解 <轉>(4495)
- 5.?算法面試題(3400)
- 6.?64位與32位編程的數據類型區別(3235)
- 7.?解決Linux pthread_create內存泄漏問題(3126)
- 8.?NUMA與英特爾下一代Xeon處理器學習心得<轉>(2993)
- 9.?c語言抓取網頁數據(2832)
- 10.?CVSNT服務器配置——添加用戶、解決無法登陸(2735)
- 11.? pthread_join函數及linux線程(2644)
- 12.?一個基于Event Poll(epoll)的TCP Server Framework,淺析epoll(2574)
-
13.?為 C/C++ 項目構建您自己的內存管理器
(2558) - 14.?memcached完全剖析系列教程《轉》(2505)
- 15.?G++編譯選項(2404)
- 16.?STL容器 erase的使用陷井<轉載>(2193)
- 17.?epoll使用例子(2117)
- 18.?linux的消息隊列與共享內存編程(2069)
- 19.?gdb帶參數調試(2061)
- 20.?The Linux Kernel Module Programming Guide(2012)
- 21.?一個關于單向鏈表的面試題(1909)
- 22.?c中strncmp與memcmp的區別(1884)
- 23.?優化Derby數據庫技巧(1831)
- 24.?一個基于完成端口的TCP Server Framework,淺析IOCP(1759)
- 25.?自己整理的指令(1747)
- 26.?autotools制作Makefile 和configure文件(1632)
- 27.?Google C++ Style Guide(1623)
- 28.?linux系統調用函數(1622)
- 29.?An In-Depth Look into the Win32 Portable Executable File Format(1606)
- 30.? vim大小寫轉換(1582)
- 31.?淺談游戲服務器---功能模塊上來看(1552)
- 32.?教你用c實現http協議(1501)
-
33.?MIPS architecture
(1496) - 34.?Aix下查看占用端口的進程(1481)
- 35.?史上最強bash函數庫(1407)
- 36.?linux trap詳解(1341)
- 37.?ms,google,vmware,nvidia美國總部面試題(1323)
- 38.?多CPU上的原子操作(1316)
- 39.?power函數寫法《轉》(1281)
-
40.?Critical Section
(1253)
評論排行榜
- 1.?著名程序庫的比較和學習經驗(3)
- 2.?解決Linux pthread_create內存泄漏問題(2)
- 3.?用prctl給線程命名(2)
-
4.?Browsers, processes, cookies and session state
(2) - 5.?全面整理的C++面試題(1)
- 6.?linux的消息隊列與共享內存編程(1)
- 7.?一個關于單向鏈表的面試題(1)
- 8.?從一道面試題看指針與數組的區別 <轉>(1)
- 9.?淺談游戲服務器---功能模塊上來看(1)
- 10.?微軟面試中簡單的算法題目(轉)(1)
- 11.?memcached完全剖析系列教程《轉》(1)
- 12.?死鎖和活鎖 deadlock and livelock(0)
- 13.?IT公司筆試算法題(0)
- 14.?effective c++(0)
-
15.?為 C/C++ 項目構建您自己的內存管理器
(0) -
16.?Comparing Two High-Performance I/O Design Patterns
(0) - 17.?boost 庫 enable_shared_from_this 實現原理分析<轉>(0)
-
18.?Which is asymptotically larger: lg(lg* n) or lg*(lg n)$? <
>(0) - 19.?TCMalloc : Thread-Caching Malloc(0)
- 20.?有抗癌效果的神奇食物(0)
- 21.?ubuntu下編譯內核(0)
- 22.?MySQL索引背后的數據結構及算法原理(0)
- 23.?wget進行整站下載<轉>(0)
- 24.?What are the difference between DDL, DML and DCL commands?<轉載>(0)
- 25.?通過證書方式實現ssh的無密碼登陸<轉>(0)
- 26.?50個有關編程的至理名言<轉>(0)
- 27.?How I explained Design Patterns to my wife《reprint》(0)
- 28.?How to explain OOD to my wife-code project《轉載》(0)
- 29.?ifconf.c《轉載》(0)
- 30.?vim configuration(0)
- 31.?<轉>how to start a kernel thread(0)
- 32.?Linux系統性能指標介紹(0)
- 33.?Linux進程的狀態和調度(0)
- 34.?關鍵字的作用 auto static register const volatile extern (0)
- 35.?epoll使用例子(0)
- 36.?Windows Socket五種I/O模型(0)
- 37.?TCP的流量控制 (0)
- 38.?Linux下各類TCP網絡服務器的實現源代碼《轉》(0)
- 39.?fopen 文本文件與二進制文件區別(0)
- 40.?Linux目錄掃描程序(0)