乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C++ 線程安全的單例模式

       流水晨香 2016-10-07

      廢話不多說,常用的代碼積淀下來。

      一、懶漢模式:即第一次調用該類實例的時候才產生一個新的該類實例,并在以后僅返回此實例。

      需要用鎖,來保證其線程安全性:原因:多個線程可能進入判斷是否已經存在實例的if語句,從而non thread safety.

      使用double-check來保證thread safety.但是如果處理大量數(shù)據時,該鎖才成為嚴重的性能瓶頸。

      1、靜態(tài)成員實例的懶漢模式:

      復制代碼
       1 class Singleton
       2 {
       3 private:
       4     static Singleton* m_instance;
       5     Singleton(){}
       6 public:
       7     static Singleton* getInstance();
       8 };
       9 
      10 Singleton* Singleton::getInstance()
      11 {
      12     if(NULL == m_instance)
      13     {
      14         Lock();//借用其它類來實現(xiàn),如boost
      15         if(NULL == m_instance)
      16         {
      17             m_instance = new Singleton;
      18         }
      19         UnLock();
      20     }
      21     return m_instance;
      22 }
      復制代碼

      2、內部靜態(tài)實例的懶漢模式

      這里需要注意的是,C++0X以后,要求編譯器保證內部靜態(tài)變量的線程安全性,可以不加鎖。但C++ 0X以前,仍需要加鎖。

      復制代碼
       1 class SingletonInside
       2 {
       3 private:
       4     SingletonInside(){}
       5 public:
       6     static SingletonInside* getInstance()
       7     {
       8         Lock(); // not needed after C++0x
       9         static SingletonInside instance;
      10         UnLock(); // not needed after C++0x
      11         return instance; 
      12     }
      13 };
      復制代碼

      二、餓漢模式:即無論是否調用該類的實例,在程序開始時就會產生一個該類的實例,并在以后僅返回此實例。

      由靜態(tài)初始化實例保證其線程安全性,WHY?因為靜態(tài)實例初始化在程序開始時進入主函數(shù)之前就由主線程以單線程方式完成了初始化,不必擔心多線程問題。

      故在性能需求較高時,應使用這種模式,避免頻繁的鎖爭奪。

      復制代碼
       1 class SingletonStatic
       2 {
       3 private:
       4     static const SingletonStatic* m_instance;
       5     SingletonStatic(){}
       6 public:
       7     static const SingletonStatic* getInstance()
       8     {
       9         return m_instance;
      10     }
      11 };
      12 
      13 //外部初始化 before invoke main
      14 const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
      復制代碼

      (完)

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多