从多线程获取单例实例的安全方法

2024-01-05

Method 1

DataCenter* DataCenter::getInstance()
{
    static DataCenter instance;
    return &instance;    
}

Method 2

DataCenter* DataCenter::getInstance()
{
    if (!m_instanceFlag)
    {
        m_instance = new DataCenter();
        m_instanceFlag = true;
    }    
    return m_instance;      
}

我正在开发一种多线程编程,DataCenter 将由多个线程访问。我曾经使用方法 2 来获取 DataCenter 的实例,效果很好。但我注意到我需要保护单例实例不被多线程调用。

我的问题是,首先我真的需要保护单例实例吗?或者操作系统为我做这件事吗?第二个问题是,第一种方法是获取单例实例的正确方法吗?

提前致谢...


1.你确实需要保护它,即使你不这样做,操作系统当然也不会为你做这件事。使用以下代码来保证线程安全:

DataCenter* DataCenter::getInstance()
{
    MutexLocker locker(DataCenter::m_mutex);
    if(!m_instanceFlag)
    {
        m_instance = new DataCenter();
        m_instanceFlag = true;
    }
    return m_instance;
}

Edit:

Where MutexLocker是这样的:

class MutexLocker
{
    pthread_mutex_t &mutex;
    public:
    MutexLocker(pthread_mutex_t &mutex):mutex(mutex)
    {
        if(pthread_mutex_lock(&this->mutex)!=0)
            throw std::runtime_error("mutex locking filed");
    }
    ~MutexLocker(void)
    {
        if(pthread_mutex_unlock(&this->mutex)!=0)
            throw std::runtime_error("mutex unlocking filed");
    }
}

2.第一种方法看起来不错,但不是线程安全的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从多线程获取单例实例的安全方法 的相关文章

随机推荐

  • Node.js、protobuf、buffer.length..如何通过 tcp 发送结构化缓冲区/消息?

    我写了一个 node ssjs 程序 它可以 使用 TLS 模块与数据服务器 Apache MIMA 进行 TCP 连接 好的 通过 protobuffer 模块对消息进行编码 解码 序列化 反序列化 OK 将序列化消息发送到服务器并获取响
  • 默认插入向量不是默认初始化吗?

    中的一个std vector构造函数规定为 强调我的 explicit vector size type n const Allocator Allocator Effects 构造一个vector with n 默认插入使用指定分配器的元
  • 如何在组框中获取选中的单选按钮? [复制]

    这个问题在这里已经有答案了 我的组框中有很多单选按钮 通常我会使用单独检查每个单选按钮If radiobutton1 Checked True Then 但我认为也许有一种聪明的方法来检查组框中正在检查哪个单选按钮 任何想法 try thi
  • 从 sqlite 数据库中获取最后一行

    我正在尝试从 SQLite 数据库中获取最后一行 到目前为止 我已经尝试过 max sql sequence 但似乎没有任何效果 我必须获取行值并将其分配给类变量 由于我是 SQLite 和 Android 的新手 因此非常感谢任何帮助 谢
  • 使用自定义引导加载程序创建可引导 ISO 映像

    我正在尝试将我用汇编语言编写的引导加载程序转换为ISO图像文件 以下是代码来自MikeOS http mikeos sourceforge net write your own os html引导加载程序 这是我的引导加载程序代码 BITS
  • 在 C# 中创建不同的画笔图案

    我正在尝试做一些类似于绘画的东西 我想弄清楚如何制作不同的画笔样式 就像在 Paint 3D 中一样 使用钢笔工具与使用画笔工具时 您会得到一定的线条填充 我不知道从哪里开始 我一天中的大部分时间都在浏览文档并观看 YouTube 视频 我
  • DataTable服务器端处理添加编辑列

    我正在使用数据表 1 10 13 服务器端处理 我想添加一个带有编辑用户链接的 编辑 列 这个怎么做 我的js文件 userTable DataTable processing true serverSide true ajax type
  • 如何将Imageview放在其他布局后面

    我使用图像视图进行动画 这样它看起来就像从左到右的移动 但我的图像显示在其他视图的前面 以便用户能够单击图像 我正在尝试显示它behind另一种观点
  • 从 ROC 曲线获取阈值

    我有一些模型 使用ROCR将预测类百分比向量封装起来 我有一个性能对象 使用规格 tpr fpr 绘制性能对象可以得到一条 ROC 曲线 我正在比较特定误报率阈值 x 的模型 我希望从性能对象中获取真阳性率 y 的值 更重要的是 我想获得用
  • 在 ssh 模式下运行时在 vscode 中打开本地终端

    当我通过 ssh 连接到 vscode 中的远程计算机时 集成终端会在远程计算机中打开一个终端 有没有办法用本地计算机的终端打开终端面板 Using the command palette default ctrl shift p cmd
  • ASP.NET 成员资格保持身份验证问题

    因此 我的应用程序很奇怪 因为当您登录时 您将保持登录状态一两页 然后就迷路了 我的设置是这样的
  • C99 支持真的还没有广泛普及吗?

    我正在阅读 GNOME 项目的一些最佳实践 他们一直强调的一件事是避免 C99 功能 因为支持仍然不广泛 他们提到的一些功能包括单行注释和在块中间声明变量等功能 这让我想知道 C99 是否支持 即使是像这样的基本功能 评论 真的还没有广泛传
  • 如何在 JAVA 中使用 PDFBox 从 PDF 创建图像

    我想从 PDF 的第一页创建图像 我正在使用 PDFBox 在网上研究后 我发现了以下代码片段 public class ExtractImages public static void main String args ExtractIm
  • libpthread.so.0:添加符号时出错:命令行中缺少 DSO

    当我编译 openvswitch 1 5 0 时 遇到以下编译错误 gcc Wstrict prototypes Wall Wno sign compare Wpointer arith Wdeclaration after stateme
  • 从监听器访问对象

    假设我们有一些Foo包含的类 public void setOnSomethingListener OnSomethingListener listener 我们将其注册为 Foo foo new Foo foo setOnSomethin
  • 如何公开嵌入式 Flash 对象的 JavaScript 接口?

    JavaScript 和Flash Player 可以通过Flash 的ExternalInterface 机制交换数据 您注册希望能够从JavaScript 调用的ActionScript 函数 我的问题 如何找出 Flash 对象的哪些
  • Python:为什么我收到 AttributeError:__enter__

    我没有重新分配 open 关键字 但仍然收到此错误 有任何建议或方向来修复我的错误吗 with tempfile mkdtemp as test dir print test dir AttributeError enter 我也是Pyth
  • 只有变量可以通过引用传递 - php

    我正在尝试此代码 但出现此错误 Only variables can be passed by reference in xxx script class page function insert db of form arr i 0 fo
  • 如何用 Jest 模拟 Axios?

    我有一个函数client index js这是使用 axios 发出请求 import axios from axios const createRequest async url method gt const response awai
  • 从多线程获取单例实例的安全方法

    Method 1 DataCenter DataCenter getInstance static DataCenter instance return instance Method 2 DataCenter DataCenter get