• <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>

            孔雀開發(fā)小屋

            專注并致力于手機(jī)客戶端開發(fā)
            <2010年3月>
            28123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            統(tǒng)計(jì)

            • 隨筆 - 103
            • 文章 - 0
            • 評(píng)論 - 251
            • 引用 - 0

            常用鏈接

            留言簿(38)

            隨筆分類

            隨筆檔案

            關(guān)注的博客

            朋友的博客

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            boost庫(kù)的Singleton的實(shí)現(xiàn)
            在工作中遇到不少情況使用singleton模式,下面采用的是最簡(jiǎn)單的一種形式:
             1 class Foo
             2 {
             3 public:
             4     static Foo& getSingleton()
             5     {
             6         static Foo foo;
             7         return foo;
             8     }
             9 
            10 private:
            11     Foo();
            12 };
            這種實(shí)現(xiàn),在單線程情況下,簡(jiǎn)單而有效。

            對(duì)于線程安全的singleton的實(shí)現(xiàn),網(wǎng)上有不少討論。這兩天看到boost庫(kù)中的一種實(shí)現(xiàn),沒(méi)有使用鎖機(jī)制,而是充分利用了C++的語(yǔ)言特性較好的解決了多線程情況下使用singleton的問(wèn)題。
            boost的singleton的實(shí)現(xiàn)基于以下假設(shè):良好的設(shè)計(jì)在進(jìn)入main函數(shù)之前應(yīng)該是單線程的。
            我們可以使用全局變量的方式來(lái)設(shè)計(jì)singleton,并且保證在使用該singleton之前其已經(jīng)被正確的初始化,如何做到?且看代碼:
             1 template <typename T>
             2 struct Singleton
             3 {
             4     struct object_creator
             5     {
             6         object_creator(){ Singleton<T>::instance(); }
             7         inline void do_nothing()const {}
             8     };
             9 
            10     static object_creator create_object;
            11 
            12 public:
            13     typedef T object_type;
            14     static object_type& instance()
            15     {
            16         static object_type obj;
            17         create_object.do_nothing();
            18         return obj;
            19     }
            20     
            21 };
            漂亮而巧妙的實(shí)現(xiàn)。
            但是上面的實(shí)現(xiàn)還是有一點(diǎn)小的缺憾,那就是只能調(diào)用類的默認(rèn)構(gòu)造函數(shù),不能調(diào)用帶參數(shù)的構(gòu)造函數(shù)。

            附:
            非常抱歉,上面這個(gè)代碼是有點(diǎn)問(wèn)題的。感謝各位童鞋及時(shí)回復(fù)并指出問(wèn)題所在。現(xiàn)在補(bǔ)上缺失的初始化部分。
            1 template <typename T>
            2 typename Singleton<T>::object_creator
            3 Singleton<T>::create_object;


            posted on 2010-02-28 22:48 孔雀 閱讀(7105) 評(píng)論(21)  編輯 收藏 引用 所屬分類: C/C++

            評(píng)論

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-01 11:09 毛毛

            對(duì)于帶參數(shù)構(gòu)造函數(shù)的支持,可以參考Loki的實(shí)現(xiàn)
            http://www.cppprog.com/2009/0905/156.html

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-01 13:14 kongque

            @毛毛
            謝謝,很好的文章!loki的做法確實(shí)解決boost的這點(diǎn)不足。

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-01 13:50 99網(wǎng)上書城

            是大叔大叔的

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn)[未登錄](méi) 2010-03-01 14:01 zuhd

            沒(méi)怎么看懂上面一段代碼,作者能詳細(xì)的解釋下嗎?謝謝

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-01 14:17 coder

            obj\Debug\main.o||In function `_ZN1AC1Ev':|
            ::instance()]+0x25)||undefined reference to `Singleton<A>::create_object'|
            ||=== Build finished: 1 errors, 0 warnings ===|

            編譯沒(méi)通過(guò),提示這個(gè)錯(cuò)誤,IDE codeblock

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn)[未登錄](méi) 2010-03-01 15:02 zuhd

            初始化的順序是怎樣的?感覺(jué)像是在循環(huán)調(diào)用

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-01 16:07 coder

            @coder
            template<typename T>
            typename Singleton<T>::object_creator Singleton<T>::create_object ;

            要加一句這個(gè)初始化 create_object .

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-01 19:05 kongque

            @coder
            感謝coder童鞋的提醒,確實(shí)需要一個(gè)初始化操作。

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn)[未登錄](méi) 2010-03-02 23:37 zuhd

            我看不懂這個(gè)單件的實(shí)現(xiàn),哪位高手能解釋下,謝謝!

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-03 10:36 kongque

            @zuhd
            你可能是覺(jué)得object_creater的構(gòu)造函數(shù)和instance()這兩個(gè)函數(shù)之間存在相互調(diào)用關(guān)系,不能確定到底誰(shuí)先執(zhí)行,誰(shuí)后執(zhí)行。
            我給你一個(gè)建議就是,你可以將代碼自己運(yùn)行一下,在object_creator的構(gòu)造函數(shù)和instance函數(shù)中的開始和結(jié)束部分都是用cout或printf打印一句話,通過(guò)這個(gè)執(zhí)行過(guò)程,你就可以看出來(lái)這個(gè)執(zhí)行的順序了。
            希望對(duì)你有所幫助。

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-03 10:57 99書城官方網(wǎng)站

            時(shí)的減肥時(shí)間的

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn)[未登錄](méi) 2010-03-04 10:34 zuhd

            沒(méi)明白你加的那段代碼放在什么地方,麻煩你貼個(gè)完整的代碼好嗎?謝謝

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-05 09:27 kongque

            @zuhd
            1 template <typename T>
            2 struct Singleton
            3 {
            4 struct object_creator
            5 {
            6 object_creator(){ Singleton<T>::instance(); }
            7 inline void do_nothing()const {}
            8 };
            9
            10 static object_creator create_object;
            11
            12 public:
            13 typedef T object_type;
            14 static object_type& instance()
            15 {
            16 static object_type obj;
            17 create_object.do_nothing();
            18 return obj;
            19 }
            20
            21 };
            22
            23 template <typename T>
            24 typename Singleton<T>::object_creator
            25 Singleton<T>::create_object;
            26
            27 int main()
            28 {
            29 return 0;
            30 }

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn)[未登錄](méi) 2010-03-05 10:04 zuhd

            謝謝孔雀的熱心回復(fù),我還是有很多問(wèn)題不懂:
            1,template <typename T>
            typename Singleton<T>::object_creator
            Singleton<T>::create_object;
            這句話的初始化把我弄糊涂了,我甚至連這句話的語(yǔ)法都沒(méi)有看懂
            2,我下了斷點(diǎn)
            如果我寫了int sint = Singleton<int>::instance();
            這樣instance就會(huì)斷進(jìn)去兩次,請(qǐng)解釋下!謝謝

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-05 20:46 kongque

            @zuhd
            1. template <typename T>
            typename Singleton<T>::object_creator
            Singleton<T>::create_object;
            這句的意思就是類的靜態(tài)成員的初始化。只不過(guò)是模板類需要使用typename進(jìn)行類型說(shuō)明而已。只是語(yǔ)法上有點(diǎn)生澀,但是事實(shí)上就是類的靜態(tài)數(shù)據(jù)成員的初始化而已。

            2. instance斷進(jìn)去兩次是對(duì)的。第一次是object_create的構(gòu)造函數(shù)中調(diào)用,這個(gè)過(guò)程在main之前就已經(jīng)完成了。第二次是你調(diào)用。
            不知道我的解釋是否清楚。
            你可以在main()進(jìn)入之后,在int sint = Singleton<int>::instance(); 之前打印一句話,可以印證這個(gè)過(guò)程。

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-06 10:16 zuhd

            謝謝,懂了,很少用到模板,有時(shí)間要充電一下

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-07 18:53 Rolf

            更小白的問(wèn)題,去掉 create_object.do_nothing();
            這句調(diào)用后,為什么在Main前就不執(zhí)行object_creator(){ Singleton<T>::instance(); }了?

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-03-08 18:55 coder

            @Rolf
            這個(gè)問(wèn)題不是很小白。。。如果Singleton不是模板的話沒(méi)有do_nothing也會(huì)執(zhí)行,但是如果在模板中就不執(zhí)行了,可能和模板的實(shí)例化有關(guān)。

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-04-10 11:27 欲三更

            說(shuō)到底boost是用事先構(gòu)造單例對(duì)象的方法規(guī)避使用鎖。
            看來(lái)不使用鎖和“使用時(shí)構(gòu)造”這兩個(gè)便利只能取一個(gè),具體實(shí)現(xiàn)時(shí)要分析利弊了。

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2010-04-28 16:11 ajohn

            boost的這個(gè)東西不要去用,details的東西都是不確定的,下個(gè)版本需要改進(jìn)的

            # re: boost庫(kù)的Singleton的實(shí)現(xiàn) 2012-09-13 20:10 sding

            時(shí)間有點(diǎn)長(zhǎng)了,但是還是想問(wèn)下:
            為什么在main函數(shù)里面實(shí)例化時(shí)是非線程安全的?
            狠狠色丁香久久婷婷综合_中| 亚洲人成无码www久久久| 国产A级毛片久久久精品毛片| 久久久久国产一级毛片高清板| 久久99精品久久久久婷婷| 国产69精品久久久久观看软件| 欧美午夜精品久久久久久浪潮| 国内精品伊人久久久久网站| 久久精品免费观看| 99久久精品免费| 伊人久久大香线焦综合四虎| 大香网伊人久久综合网2020| 久久综合综合久久97色| 精品99久久aaa一级毛片| 亚洲一区中文字幕久久| 精品久久久久国产免费| 久久亚洲中文字幕精品一区四| 久久夜色精品国产亚洲av| 亚洲伊人久久成综合人影院 | 久久99精品国产99久久6| 91精品观看91久久久久久| 9191精品国产免费久久| 热久久国产欧美一区二区精品| 亚洲午夜精品久久久久久app| 国内精品九九久久精品| 久久国产色AV免费观看| 久久久91精品国产一区二区三区| 亚洲伊人久久大香线蕉苏妲己| 久久精品国产WWW456C0M| 亚洲精品无码久久久久AV麻豆| 亚洲国产成人久久一区久久| 久久久久久精品久久久久| 久久亚洲AV成人出白浆无码国产| 久久99精品国产麻豆| 国产精品免费久久| 久久久精品国产免大香伊 | 国产成人精品久久| 国产69精品久久久久APP下载| 久久久婷婷五月亚洲97号色| 91精品婷婷国产综合久久| 久久午夜无码鲁丝片秋霞|