C 執行緒安全的單例類

2021-09-24 22:10:36 字數 1680 閱讀 4471

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

--------------------- 

#include class singleton

//防拷貝

singleton(const singleton&);

singleton& operator=(const singleton&);

public:

static singleton* getinstance() //宣告乙個靜態型別的介面來獲取例項

}return _instance;

}void delinstance() //銷毀例項

}private:

int _a;

static singleton* _instance;//宣告乙個靜態成員作為類的例項

static mutex _mtx;//保證執行緒安全的互斥鎖

};singleton* singleton::_instance = null; //初始化靜態成員變數

mutex singleton::_mtx;

以上**中加了互斥鎖,保證了執行緒安全。但也不是絕對安全的,因為加鎖或解鎖會引入新的問題,有可能拋異常或者造成死鎖。解決了執行緒安全,那麼就可以進一步提高效率。在上述**中,可以看到用了兩次判斷,也叫雙檢查機制,這就保證了只在第一次獲取物件時加鎖,避免高併發場景下每次獲取例項物件都進行加鎖,提高了效率。

--------------------- 

懶漢模式:在第一次呼叫getinstance的時候才例項化出物件,此後返回的都是該物件。相對餓漢模式而言,複雜,要確保執行緒安全問題,但在各種場景下都適用。 

餓漢模式:無論是否需要該類的例項,在程式一開始的時候會產生該類的例項物件,此後返回的都是該物件。由於是在main函式之前建立執行緒,可能會出現不確定問題,適用性受到限制。 

上面**實現的是懶漢模式,那麼下邊就實現餓漢模式

--------------------- 

namespace hungry

//防拷貝

singleton(const singleton&);

singleton& operator=(const singleton&);

public:

//static singleton& getinstance()

//static singleton& getinstance() //在類內部建立靜態例項,全域性只此乙份

void delinstance() //銷毀例項

}private:

int _a;

static singleton* _instance;

};singleton* singleton::_instance = null;

//singleton* singleton::_instance = new singleton();//全域性生成乙個例項物件

}

C 實現執行緒安全單例類

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

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

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

C 執行緒安全的單例模式

廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...