IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 单例(Singleton)C++实现方式最全总结! -> 正文阅读

[C++知识库]单例(Singleton)C++实现方式最全总结!

单例(Singleton)可以说是面试中最常被考到的设计模式了,博主现将单例(Singleton)的各种实现方式奉上,最后博主将向大家展示如何使用modern C++ 中的call_once实现单例(Singleton)。
首先是最简单的线程安全的饿汉实现模式。(所谓饿汉:无论你会不会用到这个实例,都给你创建好。博主想之所以叫饿汉可能是因为这种行事风格很像饿汉吧,异常贪婪。)

//饿汉(线程安全)
class Singleton 
{
    static Singleton* GetInstance()
    {
        static Singleton Instance;
        return &Instance;
    }
private:
    Singleton();
};

下来是多线程下不安全的懒汉模式(所谓懒汉:就是你要用这个实例的时候,我再给你创建。)而懒汉之所以多线程下不安全,是因为在下面这段代码中,有可能同时多个线程判断Instance为空,然后出现多个线程都去new的情况。

//懒汉(线程不安全)
class Singleton 
{
    static Singleton* GetInstance()
    {
        if (nullptr == Instance) //实例是否未创建
        {
            Instance = new Singleton();
        }
        return Instance;
    }
private:
    Singleton();
    static Singleton* Instance;
};

要实现线程安全的懒汉模式,我们可以使用双重检查锁。

#include <mutex>
//双重检查锁懒汉(线程安全)
class Singleton 
{
    static Singleton* GetInstance()
    {
        if (nullptr == Instance) //实例是否未创建
        {
            std::lock_guard<std::mutex> lock(mu);
            if (nullptr == Instance) 
            {
                Instance = new Singleton();
            }
        }
        return Instance;
    }
private:
    Singleton();
    static std::mutex mu;
    static Singleton* Instance;
};

最后,重磅炸弹,从C++11开始,C++提供call_once函数,我们可以使用这个函数来实现线程安全的单例(Singleton)。
call_once函数的作用是,这个函数仅会被线程调用一次,而无论有多少线程。
call_once函数要和once_flag变量一起配合使用,另外如果call_once函数绑定不同的once_flag变量,即使绑定相同的函数,这个函数依然是会被调用多次的,即一个once_flag变量只能保证一个函数被调用一次。

//使用call_once实现安全的单例(线程安全)
class Singleton 
{
    static Singleton* GetInstance()
    {
        std::call_once(flag, CreatInstance);
        return Instance;
    }

private:
    Singleton();
    static void CreatInstance() 
    {
        Instance = new Singleton();
    }
    static std::once_flag   flag;
    static std::mutex       mu;
    static Singleton*       Instance;
};

有帮助的话点个赞吧!有问题的话欢迎大家在评论区批评指正!!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章           查看所有文章
加:2021-08-10 23:03:14  更:2021-08-10 23:04:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 17:04:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码