C 實現乙個執行緒安全且高效單例類

2021-08-04 13:35:16 字數 2549 閱讀 4937

1 單例模式

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

上**:  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

classsingleton

private:

staticsingleton* p;

public:

staticsingleton* instance();

};

singleton* singleton::p = null;

singleton* singleton::instance()

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

2 懶漢與餓漢

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

特點與選擇:

3 執行緒安全的懶漢實現

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

class

singleton

private

:

static singleton*p;

public

:

static

pthread_mutex_t mutex;

static singleton*initance();

};pthread_mutex_t singleton::mutex;

singleton* singleton::p =null;

singleton*singleton::initance()

return

p;}

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

class

singleton

public

:

static

pthread_mutex_t mutex;

static singleton*initance();

inta;

};pthread_mutex_t singleton::mutex;

singleton*singleton::initance()

4 餓漢實現

為什麼我不講「執行緒安全的餓漢實現」?因為餓漢實現本來就是執行緒安全的,不用加鎖。為啥?自己想!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

classsingleton

private:

staticsingleton* p;

public:

staticsingleton* initance();

};

singleton* singleton::p =newsingleton;

singleton* singleton::initance()

C 實現執行緒安全單例類

單例模式是一種非常常用的設計模式,幾乎在稍大的工程專案中都會用到。單例類保證在全域性中只有唯一乙個類的例項物件,並且在類的內部提供了獲取這個唯一例項的介面。在類中,例項化出乙個物件需要呼叫建構函式,為了防止在類的外部呼叫建構函式構造出例項,對類的建構函式就應有所限制,可以將建構函式的訪問許可權設定為...

C 實現乙個執行緒安全的單例工廠

我們見到經常有人用 static 區域性物件的方式實現了類似單例模式,最近發現一篇文章明確寫明 編譯器在處理 static區域性變數的時候 並不是執行緒安全的 於是實現了乙個單例工廠 並且是執行緒安全的 ifndef singletonfactory h define singletonfactor...

分享乙個執行緒安全的單例模板類

單例模式應該說是最簡單的設計模式了。在此分享乙個執行緒安全的單例模板類。template class csingleton 使用interlockedcompareexchange函式保證原子操作 函式判斷m pinstance是否等於null,如果是則將m pinstance賦值為kbeingcr...