



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第詳解C++實現(xiàn)線程安全的單例模式懶漢模式下,在定義m_instance變量時先等于NULL,在調(diào)用GetInstance()方法時,在判斷是否要賦值。這種模式,并非是線程安全的,因為多個線程同時調(diào)用GetInstance()方法,就可能導(dǎo)致有產(chǎn)生多個實例。要實現(xiàn)線程安全,就必須加鎖。
下面給出改進(jìn)之后的代碼
templateclassT
classsingleton
{
protected:
singleton(){};
private:
singleton(constsingleton){};
singletonoperator=(constsingleton){};
staticT*m_instance;
staticpthread_mutex_tmutex;
public:
staticT*GetInstance();
};
templateclassT
T*singletonT::GetInstance()
{
pthread_mutex_lock(mutex);
if(m_instance==NULL)
{
m_instance=newT();
}
pthread_mutex_unlock(mutex);
returnm_instance;
}
templateclassT
pthread_mutex_tsingletonT::mutex=PTHREAD_MUTEX_INITIALIZER;
templateclassT
T*singletonT::m_instance=NULL;
這一切看起來都很完美,但是程序猿是一種天生就不知道滿足的動物。他們發(fā)現(xiàn)GetInstance()方法,每次進(jìn)來都要加鎖,會影響效率。然而這并不是必須的,于是又對GetInstance()方法進(jìn)行改進(jìn)
templateclassT
T*singletonT::GetInstance()
if(m_instance==NULL)
pthread_mutex_lock(mutex);
if(m_instance==NULL)
m_instance=newT();
pthread_mutex_unlock(mutex);
returnm_instance;
}
這也就是所謂的“雙檢鎖”機制。但是有人質(zhì)疑這種實現(xiàn)還是有問題,在執(zhí)行m_instance=newT()時,可能類T還沒有初始化完成,m_instance就已經(jīng)有值了。這樣會導(dǎo)致另外一個調(diào)用GetInstance()方法的線程,獲取到還未初始化完成的m_instance指針,如果去使用它,會有意料不到的后果。其實,解決方法也很簡單,用一個局部變量過渡下即可:
正解:
templateclassT
T*singletonT::GetInstance()
if(m_instance==NULL)
pthread_mutex_lock(mutex);
if(m_instance==NULL)
T*ptmp=newT();
m_instance=ptmp;
pthread_mutex_unlock(mutex);
returnm_instance;
}
到這里在懶漢模式下,也就可以保證線程安全了。
然而,在linux下面還有另一種實現(xiàn)。linux提供了一個叫pthread_once()的函數(shù),它保證在一個進(jìn)程中,某個函數(shù)只被執(zhí)行一次。下面是使用pthread_once實現(xiàn)的線程安全的懶漢單例模式
templateclassT
classsingleton
protected:
singleton(){};
private:
singleton(constsingleton){};
singletonoperator=(constsingleton){};
staticT*m_in
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 期中6年級下冊數(shù)學(xué)試卷
- 去年徐州市中考數(shù)學(xué)試卷
- 2025年記憶綿枕項目合作計劃書
- 企業(yè)社會責(zé)任報告編制政策影響分析
- 熱交換器冷卻效果評估報告
- 農(nóng)地保護政策執(zhí)行效果分析報告
- 瑜伽場館市場推廣渠道研究分析報告
- 七九年高考數(shù)學(xué)試卷
- 青島版六年級下冊數(shù)學(xué)試卷
- 2025年錘紋助劑合作協(xié)議書
- 叉車維修方案(3篇)
- 顱內(nèi)感染診療指南
- 兒童腺病毒肺炎
- 2025至2030中國UV打印機行業(yè)市場現(xiàn)狀分析及競爭格局與投資發(fā)展報告
- 口腔科護士正確吸唾操作規(guī)范
- 中學(xué)升旗管理制度
- 2025至2030中國氫化可的松口服片行業(yè)項目調(diào)研及市場前景預(yù)測評估報告
- 消防器材介紹課件
- 可研委托合同(合同范本)5篇
- 專業(yè)公路工程知識考察試題及答案
- 陜西西安鐵一中學(xué)2025屆英語八下期末檢測試題含答案
評論
0/150
提交評論