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

            孔雀開發小屋

            專注并致力于手機客戶端開發
            <2011年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            統計

            • 隨筆 - 103
            • 文章 - 0
            • 評論 - 251
            • 引用 - 0

            常用鏈接

            留言簿(38)

            隨筆分類

            隨筆檔案

            關注的博客

            朋友的博客

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            boost庫的Singleton的實現
            在工作中遇到不少情況使用singleton模式,下面采用的是最簡單的一種形式:
             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 };
            這種實現,在單線程情況下,簡單而有效。

            對于線程安全的singleton的實現,網上有不少討論。這兩天看到boost庫中的一種實現,沒有使用鎖機制,而是充分利用了C++的語言特性較好的解決了多線程情況下使用singleton的問題。
            boost的singleton的實現基于以下假設:良好的設計在進入main函數之前應該是單線程的。
            我們可以使用全局變量的方式來設計singleton,并且保證在使用該singleton之前其已經被正確的初始化,如何做到?且看代碼:
             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 };
            漂亮而巧妙的實現。
            但是上面的實現還是有一點小的缺憾,那就是只能調用類的默認構造函數,不能調用帶參數的構造函數。

            附:
            非常抱歉,上面這個代碼是有點問題的。感謝各位童鞋及時回復并指出問題所在。現在補上缺失的初始化部分。
            1 template <typename T>
            2 typename Singleton<T>::object_creator
            3 Singleton<T>::create_object;


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

            評論

            # re: boost庫的Singleton的實現 2010-03-01 11:09 毛毛

            對于帶參數構造函數的支持,可以參考Loki的實現
            http://www.cppprog.com/2009/0905/156.html
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-01 13:14 kongque

            @毛毛
            謝謝,很好的文章!loki的做法確實解決boost的這點不足。
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-01 13:50 99網上書城

            是大叔大叔的
              回復  更多評論    

            # re: boost庫的Singleton的實現[未登錄] 2010-03-01 14:01 zuhd

            沒怎么看懂上面一段代碼,作者能詳細的解釋下嗎?謝謝
              回復  更多評論    

            # re: boost庫的Singleton的實現 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 ===|

            編譯沒通過,提示這個錯誤,IDE codeblock
              回復  更多評論    

            # re: boost庫的Singleton的實現[未登錄] 2010-03-01 15:02 zuhd

            初始化的順序是怎樣的?感覺像是在循環調用
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-01 16:07 coder

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

            要加一句這個初始化 create_object .
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-01 19:05 kongque

            @coder
            感謝coder童鞋的提醒,確實需要一個初始化操作。
              回復  更多評論    

            # re: boost庫的Singleton的實現[未登錄] 2010-03-02 23:37 zuhd

            我看不懂這個單件的實現,哪位高手能解釋下,謝謝!
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-03 10:36 kongque

            @zuhd
            你可能是覺得object_creater的構造函數和instance()這兩個函數之間存在相互調用關系,不能確定到底誰先執行,誰后執行。
            我給你一個建議就是,你可以將代碼自己運行一下,在object_creator的構造函數和instance函數中的開始和結束部分都是用cout或printf打印一句話,通過這個執行過程,你就可以看出來這個執行的順序了。
            希望對你有所幫助。
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-03 10:57 99書城官方網站

            時的減肥時間的
              回復  更多評論    

            # re: boost庫的Singleton的實現[未登錄] 2010-03-04 10:34 zuhd

            沒明白你加的那段代碼放在什么地方,麻煩你貼個完整的代碼好嗎?謝謝
              回復  更多評論    

            # re: boost庫的Singleton的實現 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庫的Singleton的實現[未登錄] 2010-03-05 10:04 zuhd

            謝謝孔雀的熱心回復,我還是有很多問題不懂:
            1,template <typename T>
            typename Singleton<T>::object_creator
            Singleton<T>::create_object;
            這句話的初始化把我弄糊涂了,我甚至連這句話的語法都沒有看懂
            2,我下了斷點
            如果我寫了int sint = Singleton<int>::instance();
            這樣instance就會斷進去兩次,請解釋下!謝謝
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-05 20:46 kongque

            @zuhd
            1. template <typename T>
            typename Singleton<T>::object_creator
            Singleton<T>::create_object;
            這句的意思就是類的靜態成員的初始化。只不過是模板類需要使用typename進行類型說明而已。只是語法上有點生澀,但是事實上就是類的靜態數據成員的初始化而已。

            2. instance斷進去兩次是對的。第一次是object_create的構造函數中調用,這個過程在main之前就已經完成了。第二次是你調用。
            不知道我的解釋是否清楚。
            你可以在main()進入之后,在int sint = Singleton<int>::instance(); 之前打印一句話,可以印證這個過程。
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-06 10:16 zuhd

            謝謝,懂了,很少用到模板,有時間要充電一下
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-07 18:53 Rolf

            更小白的問題,去掉 create_object.do_nothing();
            這句調用后,為什么在Main前就不執行object_creator(){ Singleton<T>::instance(); }了?
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-03-08 18:55 coder

            @Rolf
            這個問題不是很小白。。。如果Singleton不是模板的話沒有do_nothing也會執行,但是如果在模板中就不執行了,可能和模板的實例化有關。
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-04-10 11:27 欲三更

            說到底boost是用事先構造單例對象的方法規避使用鎖。
            看來不使用鎖和“使用時構造”這兩個便利只能取一個,具體實現時要分析利弊了。
              回復  更多評論    

            # re: boost庫的Singleton的實現 2010-04-28 16:11 ajohn

            boost的這個東西不要去用,details的東西都是不確定的,下個版本需要改進的
              回復  更多評論    

            # re: boost庫的Singleton的實現 2012-09-13 20:10 sding

            時間有點長了,但是還是想問下:
            為什么在main函數里面實例化時是非線程安全的?
              回復  更多評論    
            人妻久久久一区二区三区| 青青热久久综合网伊人| 亚洲&#228;v永久无码精品天堂久久 | 亚洲精品国产字幕久久不卡| 无码伊人66久久大杳蕉网站谷歌 | 91超碰碰碰碰久久久久久综合| 国产成人久久精品麻豆一区| 国产精品久久久久免费a∨| 久久国产色AV免费观看| 久久国产精品免费一区二区三区| 久久无码AV中文出轨人妻| 99久久99久久| 99精品久久久久久久婷婷| 国产精品成人99久久久久 | 伊人久久亚洲综合影院| 久久久久国产一级毛片高清版| 99久久婷婷国产综合精品草原| 久久久无码精品亚洲日韩蜜臀浪潮| 成人久久久观看免费毛片| 久久久久免费精品国产| 欧美激情精品久久久久久久九九九| 久久精品中文字幕无码绿巨人| 伊人久久大香线蕉综合热线| 国产精品成人无码久久久久久| 久久人人妻人人爽人人爽| 久久频这里精品99香蕉久| 国产成人无码精品久久久久免费 | 区久久AAA片69亚洲| 精品人妻伦九区久久AAA片69| 国产精品久久99| 久久精品国产亚洲AV电影| 午夜欧美精品久久久久久久| 手机看片久久高清国产日韩| 久久久久久国产a免费观看不卡| 国产精品久久久久无码av| 久久精品国产亚洲AV麻豆网站| 性色欲网站人妻丰满中文久久不卡 | 久久成人精品| 日本精品一区二区久久久| 日本欧美国产精品第一页久久| 久久精品国产一区二区三区不卡 |