C Singleton單例實現方式

2021-07-27 06:50:57 字數 1869 閱讀 7744

1.singleton模式的意圖是什麼?或者說使用singleton模式解決的問題是什麼?

答:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享!!!

2.解決上述問題的方法:

方法一: 全域性變數或是靜態變數

此方法存在的問題:這樣做雖然能保證方便的訪問例項,但是不能保證只宣告乙個物件——也就是說除了乙個全域性例項外,仍然能建立此類的區域性例項。當然一不小心可能再建立另乙個全域性的例項。

方法二:

自己實現個簡單的單例(c++版本)。

#ifndef singleton_h

#define singleton_h

#include#include#includeusing namespace std;

namespace test

g_mutex.unlock();

}return m_instance_;

}private:

singleton(){}

static t* m_instance_;

};templatet* singleton::m_instance_=null;

}#endif

上述**有三個點需要說明下:

1.多執行緒:為防止多執行緒情況下產生多個單例指標,所以需要新增g_mutex來實現加鎖和解鎖。

2.double-check:就是

if(m_instance_==null)

做了兩次判斷,別的文章說如果不double-check會導致多個執行緒訪問get函式時導致過多執行緒掛起,這句話我的體會不深,理解不深刻,鸚鵡學舌了!

3.現在發現,這個單例模式沒有釋放類t的例項的操作!——

貌似智慧型指標auto_ptr能解決這個問題,或是新增delete()函式,在某個適當的時候集中銷毀!

4.還有建構函式宣告為private能夠防止在singleton外隨意的例項化!

答:亦可以防止防止做為基類使用呀!和 5 的作用豈不是重複了?

5.還有將析構函式宣告為private,這種設計我目前還不太理解是為什麼?

答:應該是防止被做為基類使用!(2017.02.22)

6.在使用多執行緒測試此段**時,使用g++做編譯的命令格式是:

g++ -std=c++0x  -wl,--no-as-needed  main.cpp  -pthread -o test.out

main.cpp部分的**如下:

#include"./singleton.h"

#include#includeusing namespace std;

class me

2023年2月27日更新以下內容:

無鎖結構的實現方式,但是經試驗驗證,以現在**的實現方式,耗時和有鎖結構相比無明顯區別:

這可能是因為獲得鎖之後的**只需要瞬間的執行時間,從而沒有明顯因為等待鎖而導致**耗時增加!

**中的

__sync_val_compare_and_swap(&m_flag_,0,1) 

函式可以參考這篇blog!

#ifndef singleton_h

#define singleton_h

//template #include#include#includeusing namespace std;

namespace test

#endif

#include"./singleton.h"

#include#include#includeusing namespace std;

class me

for(int i=0;i

c singleton 單例類的實現

單例設計模式是一種軟體設計原理,用於將類的例項化限制為最多乙個物件。當僅需要乙個物件來協調整個系統中的運作時,單例模式就很有用。例如,如果您使用的是將日誌寫入檔案的記錄器,則可以使用單例類建立此類記錄器。class singleton singleton const singleton delete...

C Singleton單例模式

version6 include using namespace std templateclass singleton protected 保護型別,因為子類繼承的時候要呼叫父類建構函式,寫成public肯定不行,寫成private子類就無法訪問,就需要寫friend class manager了...

C Singleton單例模式

實現單例步驟 1.建構函式私有化 2.增加靜態的 私有的當前類的指標變數 3.提供乙個靜態的公有介面,可讓使用者獲得單例物件 1 include2 3using namespace std 45 classa6 9public 10 static a getinstance 步驟3 1114 pri...