C 單例模式與執行緒安全

2021-09-19 14:39:02 字數 1716 閱讀 1948

1. 教科書裡的單例模式

我們都很清楚乙個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項

上**:

class singleton

private:

static singleton* p;

public:

static singleton* instance();

};singleton* singleton::p = null;

singleton* singleton::instance()

這是乙個很棒的實現,簡單易懂。但這是乙個完美的實現嗎?不!該方法是執行緒不安全的,考慮兩個執行緒同時首次呼叫instance方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤!同時,這也不是單例的唯一實現!

2. 懶漢與餓漢

單例大約有兩種實現方法:懶漢與餓漢。

特點與選擇:

3. 執行緒安全的懶漢實現

執行緒不安全,怎麼辦呢?最直觀的方法:加鎖。

#include class singleton

private:

static singleton* p;

public:

static pthread_mutex_t mutex;

static singleton* getinstance();

};pthread_mutex_t singleton::mutex = pthread_mutex_initializer;

singleton* singleton::p = null;

singleton* singleton::getinstance()

return p;

}

此方法也很容易實現,在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。推薦這種實現方法,真得非常簡單。

#include class singleton

public:

static pthread_mutex_t mutex;

static singleton* getinstance();

};pthread_mutex_t singleton::mutex = pthread_mutex_initializer;

singleton* singleton::getinstance()

4. 餓漢實現

餓漢實現本來就是執行緒安全的,不用加鎖。

class singleton

private:

static singleton* p;

public:

static singleton* getinstance();

};singleton* singleton::p = new singleton;

singleton* singleton::getinstance()

C 單例模式 與執行緒安全

單例模式 作為物件的建立模式,單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。在下面 的物件圖中,有乙個 單例物件 而 客戶甲 客戶乙 和 客...

c 多執行緒單例模式 執行緒安全C 單例模式

我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...

單例模式與執行緒安全

請看如下的單例類 class singleton return singleton 首先判斷singleton是否為null,如果是就建立singleton物件,否則直接返回singleton。但是判斷和建立並非原子操作,假設執行緒1正在執行null singleton,判斷為true,準備執行下一...