博客
关于我
C++并发与多线程学习笔记--单例设计模式、共享数据分析
阅读量:454 次
发布时间:2019-03-06

本文共 1840 字,大约阅读时间需要 6 分钟。

单例设计模式

在C++程序中,单例模式是一个常见的设计模式。它的核心思想是确保某一类只有一个实例被创建,并且可以从整个程序中访问。这种设计模式通过私有化构造函数和静态成员变量来实现,避免了多次创建同一类实例的可能性。

class MyCAS {private:    MyCAS() {};//构造函数私有化,无法直接创建对象private:    static MyCAS *m_instance;public:    static MyCAS *GetInstance() {    if (m_instance == nullptr) {        m_instance = new MyCAS();    }    return m_instance;}}

在程序启动时,可以在全局范围内初始化静态成员变量:

MyCAS *MyCAS::m_instance = nullptr;

在需要使用单例类时,通过Singleton模式获取实例:

MyCAS *p_a = MyCAS::GetInstance();

即使有多个线程调用GetInstance(),也只会返回同一个唯一实例。

为了确保在程序退出时释放资源,可以使用辅助类实现自动释放:

class GarRelease {public:    ~GarRelease() {        if (MyCAS::m_instance) {            delete MyCAS::m_instance;            MyCAS::m_instance = nullptr;        }    }}

在Singleton类中嵌入该释放逻辑:

static MyCAS *GetInstance() {    std::unique_lock lock(mymutex);    if (m_instance == nullptr) {        m_instance = new MyCAS();        static GarRelease release;    }    return m_instance;}

这样可以确保在多线程环境下也能正确管理单例对象的生命周期。

共享数据分析

在单例模式中,一个常见的问题是如何在多线程环境下安全地初始化和共享数据。当数据是只读时,可以避免使用互斥锁,但在需要初始化时仍需确保线程安全。

如果多个线程同时调用Singleton的GetInstance(),为了防止多次初始化,可以在Singleton类中使用互斥锁:

static MyCAS *GetInstance() {    std::unique_lock lock(mymutex);    if (m_instance == nullptr) {        m_instance = new MyCAS();        static GarRelease release;    }    return m_instance;}

这样可以防止多个线程同时进入Singleton的初始化逻辑,确保数据共享的安全性。

call_once

C++11引入了std::call_once函数,用于确保某个函数只被调用一次。这在处理共享资源时非常有用,特别是在多线程环境中。call_once函数结合一个标记(如std::once_flag)来实现其功能。

使用call_once可以避免重复初始化共享资源,并且比传统的互斥锁更高效。在Singleton类中,可以将初始化逻辑包裹在一个调用call_once的函数中:

class MyCAS {public:    static void CreateInstance() {        m_instance = new MyCAS();        static GarRelease release;    }    static MyCAS *GetInstance() {        std::call_once(g_flag, CreateInstance);        return m_instance;}}

这样,多个线程同时调用GetInstance()时,只有一个线程会执行CreateInstance(),其他线程会直接返回已有的实例。这种方式比传统的互斥锁更高效,且代码更简洁。

转载地址:http://gzjfz.baihongyu.com/

你可能感兴趣的文章
Oracle计划将ZGC项目提交给OpenJDK
查看>>
oracle零碎要点---ip地址问题,服务问题,系统默认密码问题
查看>>
Oracle静默安装
查看>>
TCP基本入门-简单认识一下什么是TCP
查看>>
org.apache.poi.hssf.util.Region
查看>>
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /
查看>>
org.hibernate.HibernateException: Unable to get the default Bean Validation factory
查看>>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
查看>>
org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded
查看>>
org.tinygroup.serviceprocessor-服务处理器
查看>>
org/eclipse/jetty/server/Connector : Unsupported major.minor version 52.0
查看>>
org/hibernate/validator/internal/engine
查看>>
orm总结
查看>>
os.system 在 Python 中不起作用
查看>>
SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
查看>>
OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
查看>>
OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
查看>>
OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>
OSG学习:场景图形管理(四)——多视图多窗口渲染
查看>>