C++線程安全的單例模式講解
廢話不多說,常用的代碼積淀下來。
一、懶漢模式
即第一次調(diào)用該類實(shí)例的時(shí)候才產(chǎn)生一個(gè)新的該類實(shí)例,并在以后僅返回此實(shí)例。
需要用鎖,來保證其線程安全性:原因:多個(gè)線程可能進(jìn)入判斷是否已經(jīng)存在實(shí)例的if語句,從而non thread safety。
使用double-check來保證thread safety。但是如果處理大量數(shù)據(jù)時(shí),該鎖才成為嚴(yán)重的性能瓶頸。
1、靜態(tài)成員實(shí)例的懶漢模式:
class Singleton
{
private:
static Singleton* m_instance;
Singleton(){}
public:
static Singleton* getInstance();
};
Singleton* Singleton::getInstance()
{
if(NULL == m_instance)
{
Lock();//借用其它類來實(shí)現(xiàn),如boost
if(NULL == m_instance)
{
m_instance = new Singleton;
}
UnLock();
}
return m_instance;
}
2、內(nèi)部靜態(tài)實(shí)例的懶漢模式
這里需要注意的是,C++0X以后,要求編譯器保證內(nèi)部靜態(tài)變量的線程安全性,可以不加鎖。但C++ 0X以前,仍需要加鎖。
class SingletonInside
{
private:
SingletonInside(){}
public:
static SingletonInside* getInstance()
{
Lock(); // not needed after C++0x
static SingletonInside instance;
UnLock(); // not needed after C++0x
return instance;
}
};
二、餓漢模式:即無論是否調(diào)用該類的實(shí)例,在程序開始時(shí)就會產(chǎn)生一個(gè)該類的實(shí)例,并在以后僅返回此實(shí)例。
由靜態(tài)初始化實(shí)例保證其線程安全性,WHY?因?yàn)殪o態(tài)實(shí)例初始化在程序開始時(shí)進(jìn)入主函數(shù)之前就由主線程以單線程方式完成了初始化,不必?fù)?dān)心多線程問題。
故在性能需求較高時(shí),應(yīng)使用這種模式,避免頻繁的鎖爭奪。
class SingletonStatic
{
private:
static const SingletonStatic* m_instance;
SingletonStatic(){}
public:
static const SingletonStatic* getInstance()
{
return m_instance;
}
};
//外部初始化 before invoke main
const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
好了,線程單例模式就講到這里,還希望對大家有所幫助!
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
深入分析Visual C++進(jìn)行串口通信編程的詳解
本篇文章是對Visual C++進(jìn)行串口通信編程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
GCC 編譯使用動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫的方法
根據(jù)鏈接時(shí)期的不同,庫又有靜態(tài)庫和動(dòng)態(tài)庫之分,有別于靜態(tài)庫,動(dòng)態(tài)庫的鏈接是在程序執(zhí)行的時(shí)候被鏈接的2013-03-03
C++語言實(shí)現(xiàn)hash表詳解及實(shí)例代碼
這篇文章主要介紹了C++語言實(shí)現(xiàn)hash表詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
Trae+Qt+MSVC環(huán)境配置的實(shí)現(xiàn)示例
本文主要介紹了Trae+Qt+MSVC環(huán)境配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
C++如何通過Qt反射機(jī)制實(shí)現(xiàn)數(shù)據(jù)類序列化
在?C++?工程中經(jīng)常需要使用數(shù)據(jù)類,并對數(shù)據(jù)類進(jìn)行存儲、打印、調(diào)試等操作,所以本文就來聊聊C++如何通過Qt反射機(jī)制實(shí)現(xiàn)數(shù)據(jù)類序列化吧2025-04-04

