這應該是懶漢模式完美單例了:
怎麼控制建立類的過程
怎麼相容多執行緒
怎麼在合適時機自動析構
怎麼自動初始化mutex和釋放
禁止拷貝,複製拷貝和等號運算子
// test.17.10.6.單例模式.cpp : 定義控制台應用程式的入口點。
#include "stdafx.h"
//#include
#include
class cwmdl
private:
cwmdl(){}
static cwmdl* m_c ;//可以自動釋放
// 禁止拷貝--複製建構函式和等號運算子宣告為私有的,並且不提供實現。
cwmdl(const cwmdl& other);
cwmdl& operator=(const cwmdl& other);
public:
static cwmdl* create()
if (nullptr==m_c)
printf("似乎未建立\r\n");
pthread_mutex_lock(&mutex);//雙判斷多執行緒加速
if (nullptr==m_c)
printf("確定未建立\r\n");
m_c = new cwmdl();
else
printf("其實建立了\r\n");
pthread_mutex_unlock(&mutex);
else
printf("已經建立\r\n");
return m_c;
class cgarbo // 它的唯一工作就是在析構函式中刪除csingleton的例項
public:
~cgarbo()
pthread_mutex_destory(&mutex);
if (cwmdl::m_c)
delete cwmdl::m_c;
static cgarbo garbo; // 定義乙個靜態成員,在程式結束時,系統會呼叫它的析構函式
static pthread_mutex_t mutex;
cwmdl* cwmdl::m_c = nullptr;
pthread_mutex_t cwmdl::mutex = pthread_mutex_initializer;//靜態初始化
unsigned int __stdcall workthread(void*)
cwmdl* p = cwmdl::create();
return 0;
int _tmain(int argc, _tchar* ar**)
//critical_section x = ();
因為是單類,只有乙個類指標
我認為 主動釋放類的話(即呼叫delete),多執行緒 可能多次呼叫,所以我們要讓它自動釋放
實驗之。
const static int hdnumber = 20;
handle hd[hdnumber] = ;
for (int i =0;i_beginthreadex(null,0,workthread,0,null,0);
waitformultipleobjects(hdnumber,hd,true,-1);
sleep(-1);
return 0;
以下是餓漢實現,來自
class singleton
protected:
singleton()
private:
static singleton* p;
public:
static singleton* initance();
singleton* singleton::p = new singleton;
singleton* singleton::initance()
return p;
c 單例的實現
單例的實現有很多的坑,並不是簡單的乙個static的成員獲取就算是單例了,下面詳細敘述下它的坑。懶漢模式 class singleton 懶漢模式在一般使用下都不會有問題,但是,這個實現是執行緒不安全的。區域性靜態變數static singleton minstance 編譯器會在編譯時期對其做處理...
c 單例實現
1.物件指標實現 class singleton unlock return m pinstance int getdata const private singleton m test 888 class cgarbo cgarbo static cgarbo m garbo static sin...
c 實現單例
單例巨集 單件定義巨集 在標頭檔案中申明 declare singleobj csampleclass 在cpp檔案中定義靜態變數 implement singleobj csampleclass 注意單件的getinstance為非執行緒安全,最好是在主線程初始化的時候呼叫一次 define de...