c++实现线程安全的单例模式

c++实现线程安全的单例模式,第1张


title: 单例模式
categories: [设计模式]
tags: [单例模式]


我的私人博客

饿汉模式
#include 

using namespace std;

class HungrySingleton{
private:
    int count = 0;
    static HungrySingleton* instance;
    HungrySingleton() = default;
public:
    ~HungrySingleton() = default;
    static HungrySingleton* getInstance(){
        return instance;
    }
    void showMessage(){
        cout<showMessage();
    return 0;
}
懒汉模式 线程安全(双重校验锁)
#include 
#include 

using namespace std;

class LazySingleton{
private:
    static LazySingleton* instance;
    static mutex _lock;
    int count = 1;
    LazySingleton() = default;
public:
    ~LazySingleton() = default;
    static LazySingleton* getInstance(){
        /* 缩小锁粒度,提高效率 */
        if(instance==nullptr){
            lock_guard locker(_lock);
            if(instance== nullptr){
                instance = new LazySingleton;
            }
        }
        return instance;
    }
    void showMessage(){
        cout<showMessage();
    return 0;
}
线程安全(局部静态变量)
#include 

class LazySingleton{
private:
    int count = 1;
    LazySingleton() = default;
public:
    ~LazySingleton() = default;
    static LazySingleton* getInstance(){
        /* 局部静态变量只会在第一次声明的时候初始化,在c++11以及之后的版本可以做到线程安全 
        1.变量在代码第一次执行到变量声明的地方时初始化。
		2.初始化过程中发生异常的话视为未完成初始化,未完成初始化的话,需要下次有代码执行到相同位置时再次初始化。
        3.在当前线程执行到需要初始化变量的地方时,如果有其他线程正在初始化该变量,则阻塞当前线程,直到初始化完成为止。
        4.如果初始化过程中发生了对初始化的递归调用,则视为未定义行为
        */
        static LazySingleton instance;
        return &instance;
    }
    void showMessage(){
        cout<showMessage();
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/797586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存