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;

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

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

相关推荐
andyweike7 小时前
php笔记
开发语言·笔记·php
EatFan7 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
蒸蒸yyyyzwd7 小时前
秋招学习笔记 day46
c++·八股
Maiko Star8 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
Circ.8 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
现任明教教主~10 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
Zhou14113610 小时前
SpringSecurity_02_授权与高级功能
开发语言·python
一条破秋裤10 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
布吉岛的石头10 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
码匠许师傅10 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http