分享乙個執行緒安全的單例模板類

2022-07-18 00:39:14 字數 1404 閱讀 8681

單例模式應該說是最簡單的設計模式了。在此分享乙個執行緒安全的單例模板類。

template class csingleton

// 使用interlockedcompareexchange函式保證原子操作

// 函式判斷m_pinstance是否等於null,如果是則將m_pinstance賦值為kbeingcreatedmarker

// 函式返回值為m_pinstance的初始值,通過判斷返回值是否等於null得知是否可以進行例項化

if (interlockedcompareexchange(

reinterpret_cast(&m_pinstance),

static_cast(kbeingcreatedmarker),

static_cast(null)) == null)

// 如果m_pinstance是kbeingcreatedmarker,即表示正在建立中

// switchtothread讓出剩餘的時間片等待建立過程完成

while (m_pinstance == kbeingcreatedmarker)

// 到達此處表明建立過程已經完成了

return reinterpret_cast(m_pinstance);

}type& operator*()

type* operator->()

private:

static volatile intptr_t m_pinstance;

};template volatile intptr_t csingleton::m_pinstance = null;

假設我們有個ccmdmanager類

class ccmdmanager

;};

使用方法很簡單,如下:

int main()

如果我們想要完全限制ccmdmanager不被例項化第二次,我們可以這麼做

class ccmdmanager

;friend class csingleton;

};

通過將建構函式設定為private,且僅對class csingleton開放,就可以保證使用者只能使用ccmdmanager *pmgr = csingleton::getinstance()這種方式呼叫了。

順便說一下,這個**的一些侷限性

1. 因為使用了interlockedcompareexchange這個函式,所以只能在windows下使用,但是不可否定的是這個函式的效率極高,完成比較並交換只要一條指令。

2. csingleton在例項化物件時,只支援預設建構函式。一般情況下,這個也是可以接受的。

分享乙個單例模型類 Singleton

每個物件都寫單例,單調又無聊。因此我寫了個基類,只要整合,就實現了單例。而且支援多單例 不同id對應不同的單例 using system using system.collections.generic using system.text namespace pixysoft.designpatte...

分享乙個單例模型類 Singleton

每個物件都寫單例,單調又無聊。因此我寫了個基類,只要整合,就實現了單例。而且支援多單例 不同id對應不同的單例 using system using system.collections.generic using system.text namespace pixysoft.designpatte...

乙個執行緒安全的單例模式測試

單例模式,一般我喜歡這樣實現 class singletest singletest singletest instance singletest singletest singletest singletest 然後這樣用 singletest ts singletest instance 這麼實...