C 單例的完美實現

2021-10-06 02:25:28 字數 1949 閱讀 6576

這應該是懶漢模式完美單例了:

怎麼控制建立類的過程

怎麼相容多執行緒

怎麼在合適時機自動析構

怎麼自動初始化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...