C++中单线程方式之无脑上锁

单线程方式

单线程的情况下非常简单,直接判断指针是否为空皆可。

复制代码
static Singleton* instance() {
    if (nullptr == s_instancePtr) {
        s_instancePtr = new Singleton();
    }
    return s_instancePtr;
}

显然,这份代码无法应对多线程的情况。

比如当两个线程同时访问该函数时,指针都为空都会进入 if 条件并进行了两次 new 操作。对整个软件程序可能会造成不可估计的后果。

无脑上锁

我们都知道,对于多线程的情况下,上锁是一种最直接且有效的方式。

在这里直接无脑上锁便可以解决该问题。

复制代码
#include <mutex>

class Singleton {
private:
    static Singleton* s_instancePtr;
    static std::mutex s_mutex;

public:
    static Singleton* instance() {
        std::lock_guard<std::mutex> lock(s_mutex);
        if (nullptr == s_instancePtr) {
            s_instancePtr = new Singleton();
        }
        return s_instancePtr;
    }

private:
    // 省略构造函数的处理
};

Singleton* Singleton::s_instancePtr = nullptr;
std::mutex Singleton::s_mutex;

虽然我们解决了多线程的问题。

在实例构造完成后,后续每次程序调用单例的时候的上锁。但上锁是一个开销很大的操作,因此在高并发的程序中,这种方式会一定程度上的影响程序的运行效率。

相关推荐
大圣编程4 小时前
Java 多维数组详解
java·开发语言
万法若空7 小时前
【算法-查找】查找算法
java·数据结构·算法
殳翰7 小时前
下服务器端开发流程及相关工具介绍(C++)
开发语言·c++
落寞的星星8 小时前
这个对象就包含了已经转换好的DFA和各种词法分析器运转所需要的参数。下一步,我们就可以用ScannerInfo对象创建出Scanner对象,请看下面的代码:
开发语言·c#
nothing&nowhere8 小时前
用 Python 做问卷数据清洗:无效样本检测与处理实战
开发语言·python·数据清洗·数据处理·问卷星·问卷星脚本·刷问卷
青瓦梦滋8 小时前
协议定制/序列化-反序列化(Linux视角)
linux·服务器·网络·c++
2601_961593428 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
HZZD_HZZD9 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
多加点辣也没关系11 小时前
JavaScript|第4章:类型转换
开发语言·javascript
聪慧的水蜜桃11 小时前
【YFIOs】用C#开发硬件之设备上云
开发语言·c#