C++中線程安全的單例模式(2)

簡介

本文介紹單例模式實現(xiàn)的另外兩種方法:

  • 通過double check(借助std::atomic)實現(xiàn)單例模式
  • 采用static member實現(xiàn)單例模式

double check實現(xiàn)單例模式

在使用double check來實現(xiàn)線程安全的單例模式中,我們需要使用std::atomic
來實現(xiàn)必要的同步。

class SingleTon {
public:
    static SingleTon* getInstance(void)
    {
        if(s_p.load() == nullptr){
            std::lock_gurad<std::mutex> lk(s_mtx);
            if(s_p.load() == nullptr){
                auto p = new SingleTon();
                s_p.store(p);
            }
        }
        return s_p.load();
    }
public:
    int getValue() {
        return m_int;
    }
private:
    static std::mutex s_mtx;
    static std::atomic<SingleTon*> s_p;
    SingleTon(SingleTon&) = delete;
    SingleTon& operator=(SingleTon&) = delete;
    SingleTon(SingleTon&&) = delete;
    SingleTon& operator=(SingleTon&&) = delete;
    SingleTon() {
        m_int = 0;
    }
private:
    int m_int;
};

借助static member實現(xiàn)單例模式

在c++11中,c++標準開始支持多線程模式,函數(shù)內(nèi)部的靜態(tài)成員變量的初始化為線程安全的,
這也很大的簡化了單例模式的實現(xiàn)方始。

class SingleTon {
public:
    static SingleTon& getInstance(void)
    {
        static SingleTon s_singleTon(); //采用靜態(tài)成員變量
        return s_singleTon;
    }
public:
    int getValue() {
        return m_int;
    }
private:
    SingleTon(SingleTon&) = delete;
    SingleTon& operator=(SingleTon&) = delete;
    SingleTon(SingleTon&&) = delete;
    SingleTon& operator=(SingleTon&&) = delete;
    SingleTon() {
        m_int = 0;
    }
private:
    int m_int;
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡介 單例模式是很常用的一種設(shè)計模式,在實現(xiàn)過程中要非常注意線程安全,我們會介紹四種方式來實現(xiàn)線程安全的單例模式:...
    Kai_Z閱讀 2,451評論 3 1
  • 接著上節(jié) mutex,本節(jié)主要介紹atomic的內(nèi)容,練習代碼地址。本文參考http://www.cplusplu...
    jorion閱讀 74,075評論 1 14
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 2,177評論 0 3
  • 接著上節(jié) condition_varible ,本節(jié)主要介紹future的內(nèi)容,練習代碼地址。本文參考http:/...
    jorion閱讀 15,033評論 1 5
  • 其實從小學(xué)一年級我就有被同學(xué)欺負的經(jīng)歷了,每天我僅有的一塊錢零花錢都要上交給她。后來我不敢去上課,父母發(fā)現(xiàn)才告老...
    如風過境丶閱讀 287評論 0 2

友情鏈接更多精彩內(nèi)容