1. 程式人生 > >用C++實現單例模式4——C++11實現

用C++實現單例模式4——C++11實現

std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;

Singleton* Singleton::getInstance() {
    Singleton* tmp = m_instance.load();
    if (tmp == nullptr) {
        std::lock_guard<std::mutex> lock(m_mutex);
        tmp = m_instance.load();
        if (tmp == nullptr) {
            tmp = new Singleton;
            m_instance.store(tmp);
        }
    }
    return tmp;
}
4.call_once(最簡單的實現)
     在多執行緒程式設計中,有一個常見的情景是某個任務只需要執行一次。在C++11中提供了很方便的輔助類once_flag,call_once。
     以下是對std::call_once的原文說明:
         rom:std::[email protected] 
         Calls fn passing args as arguments, unless another thread has already executed (or is currently executing) a call to call_once with the same flag. 
        If another thread is already actively executing a call to call_once with the same flag, it causes a passive execution: Passive executions do not call fn but do not return until the active execution itself has returned, and all visible side effects are synchronized at that point among all concurrent calls to this function with the same flag. 
If an active call to call_once ends by throwing an exception (which is propagated to its calling thread) and passive executions exist, one is selected among these passive executions, and called to be the new active call instead. 
         Note that once an active execution has returned, all current passive executions and future calls to call_once (with the same flag) also return without becoming active executions. 
       The active execution uses decay copies of the lvalue or rvalue references of fn and args, ignoring the value returned by fn.
also see: 


大意就是:
     call_one保證函式fn只被執行一次,如果有多個執行緒同時執行函式fn呼叫,則只有一個活動執行緒(active call)會執行函式,其他的執行緒在這個執行緒執行返回之前會處於”passive execution”(被動執行狀態)—不會直接返回,直到活動執行緒對fn呼叫結束才返回。對於所有呼叫函式fn的併發執行緒的資料可見性都是同步的(一致的)。 
     如果活動執行緒在執行fn時丟擲異常,則會從處於”passive execution”狀態的執行緒中挑一個執行緒成為活動執行緒繼續執行fn,依此類推。 
    一旦活動執行緒返回,所有”passive execution”狀態的執行緒也返回,不會成為活動執行緒。
     由上面的說明,我們可以確信call_once完全滿足對多執行緒狀態下對資料可見性的要求。
    所以利用call_once再結合lambda表示式,前面幾節那麼多複雜程式碼,在這裡千言萬語凝聚為一句話:

Singleton* Singleton::m_instance;
Singleton* Singleton::getInstance() {
    static std::once_flag oc;//用於call_once的區域性靜態變數
    std::call_once(oc, [&] {  m_instance = new Singleton();});
    return m_instance;
}
總結
本文中提到的幾種方法都是安全可用的方案,具體用哪種,我個人覺得還是call_once最簡單,我肯定選call_one。但不代表前面的那麼多都白寫了,其實學習每種方法過程中讓我對c++11記憶體模型有了更深入的理解,這才是最大的收穫。

相關推薦

C++實現模式4——C++11實現

std::atomic<Singleton*> Singleton::m_instance; std::mutex Singleton::m_mutex; Singleton* Singleton::getInstance() { Singleton* tmp = m_instance

C++】模式C++實現

單例模式的概念 只允許一個產生一個物件的類單例模式的實現方法 1.單例類保證全域性只有唯一一個自行建立的例項物件 2.單例類提供獲取這個唯一例項的介面單例模式的優缺點 優點 (1)阻止其他度物件例項化

c++的模式c++11模式的優化

on() end per let namespace lease 是否 存在 建立 單例模式 單例模式,可以說設計模式中最常應用的一種模式了,據說也是面試官最喜歡的題目。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全

(C++)模板或巨集實現模式

最近在cocos2d-x開發中經常會用到單例模式,而每個單例模式類實際上具備相似的基礎結構,為了便於快速寫出一個具有單例模式的類,可以藉助模板或者巨集。 1.單例模式的類實現 首先,給出一個基本的實現單例模式的程式碼: class Singleton { public:

C# 模式的多種簡單實現

bject summary tor image pan actor 多太 一個 構造函數 什麽是單例模式? 這裏我就不做過多的解釋了, 畢竟關於Singleton的資料實在是太多太多了。點擊這裏 1.簡單的思路就是, 創建對象單例的動作轉移到另外的行為上面, 利用一個行

利用c++的private和static實現模式

精髓就是 將建構函式設定為private屬性,並且將複製建構函式和賦值建構函式也設定為private屬性,這樣的話,就無法在外部建立物件,所以此時還需要一個public的函式:getHumanInterface(),這個函式來呼叫private屬性的建構函式來生成我們需要的物件,並且將這個物

C++實現模式

提幾個問題吧 1.執行緒安全 2.單件物件與物件彼此依賴,析構可能出現問題 3.必須從此類派生 有時候想想,單件這東西真是有點多餘,文件齊全命名規範的全域性變數或全域性函式完全不會有問題。

C++ (設計模式實現模式

設計模式 從實踐的角度來看,設計模式有兩個重要的屬性。首先,它們描述了經過驗證的、成功的設計技術,這些技術可以按上下文相關的方式進行定製,一遍滿足新的設計場合的要求。其次,並且可能更重要的是,在提及某個特定模式的應用時不僅包括其中用到的技術,還包括應用該模式的動因以及應用後所達到的效果。

三種模式C++實現

簡介         因為在設計或開發中,肯定會有這麼一種情況,一個類只能有一個物件被建立,如果有多個物件的話,可能會導致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使用的情形也不相同。今天要實現的是常用的三種,分別

C++實現模式(包括採用C++11中的智慧指標)

    對於設計模式來說,以前只是看過基礎的理論,很多都沒有實現和使用過。這段時間看到了別人C++程式碼中使用了單例模式,發現了很多新的東西,特此總結記錄一下。說話比較囉嗦,希望由淺入深,幫助大家理解!     單例模式,顧名思義,即一個類只有一個例項物件。C++一般的方法

C#/.NET 模式——懶漢式,餓漢式,三種實現方法

C# 單例模式 ——懶漢式,餓漢式# 註釋: /// 單例模式 /// /// 餓漢式 :第一時間建立例項,類載入就馬上建立 /// 懶漢式 :需要才建立例項,延遲載入 /// /// 單例模式會長期持有一個物件,不會釋放 /// 普通例項使用完後釋放 /// /// 單例

設計模式——模式C++實現

一、單例模式定義: 保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點,該例項被所有程式模組共享。 二、應用場景: 比如在某個伺服器程式中,該伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置

C#模式的幾種實現方式

文章總結自張波老師的視訊教程 單例模式 動機(Motivation) 在軟體系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個例項,才能確保它們的邏輯正確性、以及良好的效率。

模式應用場景及實現(By C++)

      單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在一個,單例模式是最好的解決方案。  

設計模式模式C++程式碼實現

1、單例模式: 單例模式:用來建立獨一無二的,只能夠有一個例項的物件。 單例模式的結構是設計模式中最簡單的,但是想要完全實現一個執行緒安全的單例模式還是有很多陷阱的。 2、應用場景: 共享資料或者共享訪問點; 建立一個物件需要消耗的資源過多,如訪問IO和

C++ Singleton () 模式最優實現

J. Nakamura 把它叫作 "Gamma Singleton", 因為這是 Gamma 在他大名鼎鼎的 <<設計模式>> (<<Design Patterns>>) [Gamma] 一書採用的方法. 稱它為 "懶漢模式" 是因為單例例項只在第一次被使

C++ 實現模式

單例模式是任何面嚮物件語言繞不過的,單例模式是很有必要的,接下來我用最樸素的語言來解釋和記錄單例模式的學習。什麼是單例模式?單例模式就是一個類只能被例項化一次 ,更準確的說是只能有一個例項化的物件的類。建立一個單例模式的類(初想)一個類只能有一個例項化的物件,那麼這個類就要禁

linux下c++ 實現模式

singleton.h,下面是原始碼#include <unistd.h> #include <pthread.h> using namespace std; class Lock { private: pthr

C++模式的五種實現

Singleton.h  #ifndef _SINGLETON_H_ #define _SINGLETON_H_ #include <mutex> /*******************

C++如何實現模式

C++有時會用到單例模式,比如和資料庫連線的類,我們只需要一個物件,那麼這時候我們就要限制類物件產生的數量,允許一個類產生一個物件,如何讓一個類產生一個物件呢,也就是實現單例模式? 方法一:將建構函式