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;

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

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

相关推荐
liuze4082 分钟前
安装boss-zhipin-mcp(招聘)
开发语言·python
霸道流氓气质4 分钟前
Spring AI Alibaba 系列总结:Java 工程师 AI 能力全景图谱
java·人工智能·spring
博、、11 分钟前
智慧场馆解决方案系统开发实战:从架构设计到落地指南
开发语言·需求分析
欧特克_Glodon13 分钟前
OpenCV计算机视觉开发入门与实践<三十五>:开发视频播放器
c++·opencv·计算机视觉·音视频
二十雨辰22 分钟前
[Java]-场景题
java·开发语言
MZA66626 分钟前
Spring Boot 实战:基于自定义注解 + AOP 实现 Kafka 消息无侵入异步上送
java·spring boot·kafka
我是大猴子27 分钟前
为什么SSE无法代替Webscoket
java
重庆小透明33 分钟前
Kafka 完全指南:从基础组件到核心原理(包含面试题)
java·分布式·微服务·架构·kafka
CodeStats43 分钟前
【Java文件IO】Java 文件 IO 体系深度拆解(中):NIO API 详解、Files 与 FileChannel 巅峰对决
java·io·文件·nio·零拷贝·mmap
geovindu1 小时前
java:Observer Pattern
java·开发语言·后端·观察者模式·设计模式·行为模式