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...