• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            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
             

            publicvoid 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)  編輯 收藏 引用

            <2009年3月>
            22232425262728
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产乱子伦精品免费午夜| 国产69精品久久久久观看软件| 中文精品久久久久人妻不卡| 久久中文字幕精品| 久久99九九国产免费看小说| 国产精品久久久久蜜芽| 一97日本道伊人久久综合影院| 日产精品久久久久久久| 亚洲精品无码久久久久| 久久99热只有频精品8| 狠狠精品干练久久久无码中文字幕| 久久综合综合久久狠狠狠97色88| 久久99中文字幕久久| 久久综合九色综合久99| 午夜精品久久久久成人| 伊人久久大香线蕉综合影院首页| 国产午夜福利精品久久| 91精品国产综合久久婷婷| 国产成年无码久久久免费| 色综合久久中文字幕综合网| 久久福利青草精品资源站免费| 亚洲人成伊人成综合网久久久| 久久亚洲视频| 久久精品夜色噜噜亚洲A∨| 久久国产精品国产自线拍免费| 男女久久久国产一区二区三区| 久久久久综合国产欧美一区二区| 久久久久亚洲AV无码麻豆| 国产69精品久久久久9999APGF| 久久精品无码专区免费青青| 久久丝袜精品中文字幕| 2021最新久久久视精品爱| 精品久久久久久久中文字幕| 久久大香香蕉国产| 国产亚洲精品美女久久久| 久久婷婷激情综合色综合俺也去| 亚洲AV无一区二区三区久久 | 狠狠综合久久综合88亚洲| 色综合久久天天综线观看| 亚洲欧美国产精品专区久久| 精品久久久久成人码免费动漫 |