Randy
人之所以痛苦,在于追求錯誤的東西
volatile
盡管C和C++標(biāo)準(zhǔn)對于線程都明顯的“保持沉默”,但它們以volatile關(guān)鍵字的形式,確實(shí)為多線程保留了一點(diǎn)特權(quán)。
就象大家更熟悉的const一樣,volatile是一個類型修飾符(type modifier)。
它是被設(shè)計(jì)用來修飾被不同線程訪問和修改的變量。
如果沒有volatile,基本上會導(dǎo)致這樣的結(jié)果:要么無法編寫多線程程序,要么編譯器失去大量優(yōu)化的機(jī)會。
class
Gadget
{
public
:
void
Wait()
{
while
(
!
flag_)
{
Sleep(
1000
);
//
sleeps for 1000 milliseconds
}
}
void
Wakeup()
{
flag_
=
true
;
}
private
:
bool
flag_;
}
;
上面代碼中Gadget::Wait的目的是每過一秒鐘去檢查一下flag_成員變量,當(dāng)flag_被另一個線程設(shè)為true時,該函數(shù)才會返回。
然而,這個Wait函數(shù)是錯誤的。
假設(shè)編譯器發(fā)現(xiàn)Sleep(1000)是調(diào)用一個外部的庫函數(shù),它不會改變成員變量flag_,那么編譯器就可以斷定它可以把flag_緩存在寄存器中,以后可以訪問該寄存器來代替訪問較慢的主板上的內(nèi)存。
這對于單線程代碼來說是一個很好的優(yōu)化,但是在現(xiàn)在這種情況下,
它破壞了程序的正確性:當(dāng)你調(diào)用了某個Gadget的Wait函數(shù)后,即使另一個線程調(diào)用了Wakeup,Wait還是會一直循環(huán)下去。
這是因?yàn)閒lag_的改變沒有反映到緩存它的寄存器中去。編譯器的優(yōu)化未免有點(diǎn)太……樂觀了。
在大多數(shù)情況下,把變量緩存在寄存器中是一個非常有價(jià)值的優(yōu)化方法,如果不用的話很可惜。
C和C++給你提供了顯式禁用這種緩存優(yōu)化的機(jī)會。如果你聲明變量是使用了volatile修飾符,
編譯器就不會把這個變量緩存在寄存器里——每次訪問都將去存取變量在內(nèi)存中的實(shí)際位置。
這樣你要對Gadget的Wait/Wakeup做的修改就是給flag_加上正確的修飾:
class
Gadget
{
public
:
private
:
volatile
bool
flag_;
}
;
posted on 2008-10-13 17:27
Randy
閱讀(187)
評論(0)
編輯
收藏
引用
只有注冊用戶
登錄
后才能發(fā)表評論。
【推薦】100%開源!大型工業(yè)跨平臺軟件C++源碼提供,建模,組態(tài)!
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © Randy
<
2009年3月
>
日
一
二
三
四
五
六
22
23
24
25
26
27
28
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
導(dǎo)航
C++博客
首頁
新隨筆
聯(lián)系
聚合
管理
統(tǒng)計(jì)
隨筆 - 37
文章 - 0
評論 - 24
引用 - 0
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(3)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2009年11月 (1)
2009年6月 (1)
2009年5月 (3)
2009年3月 (2)
2008年12月 (1)
2008年11月 (3)
2008年10月 (4)
2008年9月 (1)
2008年7月 (3)
2008年6月 (1)
2008年4月 (1)
2008年3月 (3)
2008年2月 (2)
2007年11月 (2)
2007年10月 (9)
搜索
最新評論
1.?re: richedit2
我想知道SendMessage(hwndBuffer, EM_SETSEL,lparam,wparam);中l(wèi)param和wparam的含義。。。求告知
--gook
2.?re: c++之父之一席之談(也許是笑話,但不要僅僅當(dāng)成笑話)[未登錄]
可以再無知一點(diǎn)么
--哈哈
3.?re: C++ 枚舉類型的思考[未登錄]
operator int()還是需要的
支持
這個很需要的
現(xiàn)在C++11 出來了,域的問題解決了
但還是需要 operator int()
--kk
4.?re: 毫秒級計(jì)時器
國外新聞
http://www.ciqol.net/seenews
--外貿(mào)領(lǐng)航
5.?re: C++ 枚舉類型的思考[未登錄]
評論內(nèi)容較長,點(diǎn)擊標(biāo)題查看
--K
閱讀排行榜
1.?C++ 枚舉類型的思考(6357)
2.?毫秒級計(jì)時器(5489)
3.?C++界面庫 - Xtreme Toolkit Pro[轉(zhuǎn)載](3382)
4.?在控制臺程序中隱藏控制臺窗口(2602)
5.?Google單元測試框架(轉(zhuǎn))(2347)
評論排行榜
1.?內(nèi)存填充值的理解(8)
2.?C++ 枚舉類型的思考(7)
3.?c++之父之一席之談(也許是笑話,但不要僅僅當(dāng)成笑話)(2)
4.?字節(jié)對齊(2)
5.?C/C++中的近指令、遠(yuǎn)指針和巨指針(1)
久久国产乱子伦精品免费午夜
|
国产69精品久久久久观看软件
|
中文精品久久久久人妻不卡
|
久久中文字幕精品
|
久久99九九国产免费看小说
|
国产精品久久久久蜜芽
|
一97日本道伊人久久综合影院
|
日产精品久久久久久久
|
亚洲精品无码久久久久
|
久久99热只有频精品8
|
狠狠精品干练久久久无码中文字幕
|
久久综合综合久久狠狠狠97色88
|
久久99中文字幕久久
|
久久综合九色综合久99
|
午夜精品久久久久成人
|
伊人久久大香线蕉综合影院首页
|
国产午夜福利精品久久
|
91精品国产综合久久婷婷
|
国产成年无码久久久免费
|
色综合久久中文字幕综合网
|
久久福利青草精品资源站免费
|
亚洲人成伊人成综合网久久久
|
久久亚洲视频
|
久久精品夜色噜噜亚洲A∨
|
久久国产精品国产自线拍免费
|
男女久久久国产一区二区三区
|
久久久久综合国产欧美一区二区
|
久久久久亚洲AV无码麻豆
|
国产69精品久久久久9999APGF
|
久久精品无码专区免费青青
|
久久丝袜精品中文字幕
|
2021最新久久久视精品爱
|
精品久久久久久久中文字幕
|
久久大香香蕉国产
|
国产亚洲精品美女久久久
|
久久婷婷激情综合色综合俺也去
|
亚洲AV无一区二区三区久久
|
狠狠综合久久综合88亚洲
|
色综合久久天天综线观看
|
亚洲欧美国产精品专区久久
|
精品久久久久成人码免费动漫
|