为了避免单例类在多线程中重复的创建,下面提供了两种解决方法:

  1.互斥锁+双重检查

  2.std::call_once()

 

方法一:互斥锁+双重检查

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std; std::mutex my_mutex; // 创建一个单例类
class MyCAS
{
private:
MyCAS() {} // 私有化构造函数
static MyCAS* m_instance; // 静态成员变量 public:
static MyCAS* GetInstance()
{
// 2.双重检查
if (m_instance == NULL)
{
// 1.互斥锁
std::lock_guard<std::mutex> mylock(my_mutex);
if (m_instance == NULL)
{
m_instance = new MyCAS();
static CGarhuishou ci;
}
}
return m_instance;
} // 类中封装一个类,用来析构单例类
class CGarhuishou
{
public:
~CGarhuishou()
{
if (MyCAS::m_instance)
{
delete MyCAS::m_instance;
MyCAS::m_instance = NULL;
}
}
}; void func() { cout << "test 123" << endl; }
}; // 类静态变量初始化
MyCAS* MyCAS::m_instance = NULL; // 线程入口函数
void myThread()
{
cout << "线程开始执行" << endl;
MyCAS* p = MyCAS::GetInstance();
cout << "线程结束执行" << endl;
} int main()
{
// 创建对象,但会对象指针
std::thread t1(myThread);
std::thread t2(myThread); t1.join();
t2.join(); return 0;
}

方法二:std::call_once()

#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std; std::once_flag g_flag; // 创建一个单例类
class MyCAS
{
// 只被调用一次
static void CreateInstance()
{
m_instance = new MyCAS();
static CGarhuishou ci;
} private:
MyCAS() {} // 私有化构造函数
static MyCAS* m_instance; // 静态成员变量 public:
static MyCAS* GetInstance()
{
std::call_once(g_flag, CreateInstance);
return m_instance;
} // 类中封装一个类,用来析构单例类
class CGarhuishou
{
public:
~CGarhuishou()
{
if (MyCAS::m_instance)
{
delete MyCAS::m_instance;
MyCAS::m_instance = NULL;
}
}
}; void func() { cout << "test 123" << endl; }
}; // 类静态变量初始化
MyCAS* MyCAS::m_instance = NULL; // 线程入口函数
void myThread()
{
cout << "线程开始执行" << endl;
MyCAS* p = MyCAS::GetInstance();
cout << "线程结束执行" << endl;
} int main()
{
// 创建对象,但会对象指针
std::thread t1(myThread);
std::thread t2(myThread); t1.join();
t2.join(); return 0;
}

std::thread 六:多线程&单例类的更多相关文章

  1. Java线程和多线程(五)——单例类中的线程安全

    单例模式是最广泛使用的创建模式之一.在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁.为了达到这个目的,开发者 ...

  2. c++:自己动手实现线程安全的c++单例类

    前段时间使用c++做项目开发,需要根据根据配置文件路径加载全局配置文件,并对外提供唯一访问点.面对这样一个需求,自然的就想到了使用单例模式来创建一个单例配置对象,供外部调用.一开始想使用boost中自 ...

  3. C++11 单例类实现

    单例类: (1) 单例类保证全局只有一个唯一的实例对象. (2) 单例类保证只有唯一的接口获取这唯一实例. 非线程安全的单例类举例: class CSingleton { public: ~CSing ...

  4. iOS中编写单例类的心得

    单例 1.认识过的单例类有哪些: NSUserDefaults.NSNotificationCenter.NSFileManager.UIApplication 2.单例类 单例类某个类在代码编写时使 ...

  5. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  6. 28.C++- 单例类模板(详解)

    单例类 描述 指在整个系统生命期中,一个类最多只能有一个实例(instance)存在,使得该实例的唯一性(实例是指一个对象指针)  , 比如:统计在线人数 在单例类里,又分为了懒汉式和饿汉式,它们的区 ...

  7. 游戏设计模式——C++单例类

    前言: 本文将探讨单例类设计模式,单例类的懒汉模式/饿汉模式,单例类的多线程安全性,最后将利用C++模板减少单例类代码量. 本文假设有一个Manager管理类,并以此为探究单例类的设计模式. 懒汉模式 ...

  8. muduo网络库源码学习————线程本地单例类封装

    muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...

  9. Java单例类的简单实现

    对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...

  10. JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

    JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...

随机推荐

  1. 第135篇:Three.js基础入门

    好家伙,这东西太帅了,我要学会   先放张帅图(都是用three.js做出来的,这我学习动力直接拉满)    还有另外一个 Junni is... 帧数太高,录不了   开始学习 官方文档 1.Thr ...

  2. Java 常用类 JDK 8 之前日期和时间的API测试

    1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 import java.util.Date; 6 7 8 /** ...

  3. Vue3音乐播放器组件,可显示歌词

    在线体验地址 音乐播放器 1,安装 npm install apple-music-player 或 yarn add apple-music-player 2,在main.ts中引入 import ...

  4. Acwing第 141 场周赛

    A题 签到模拟即可 B题 单独考虑每一个a[i],如果i要是答案需要指针移动多少次,然后算完,排个序,指针移动最少的就是答案. #include <bits/stdc++.h> #defi ...

  5. 基于pythondetcp多个客户端连接服务器

    壹: TCP是面向运输层的协议.使用TCP协议之前,必须先建立TCP连接,在传输完成后,必须释放已经建立的TCP连接.每条TCP连接只能有两个端,每一条TCP连接只能是点对点的.TCP提供可靠的交付的 ...

  6. 喜报|3DCAT成为国内首批适配Vision Pro内容开发者

    近日,苹果在上海总部举办了国内首场 Apple Vision Pro 开发者实验室活动,3DCAT作为国内领先的实时渲染云平台参与了此次活动,成为国内首批适配 Vision Pro 的内容开发者之一. ...

  7. npm ERR! code ENOENT npm ERR! syscall open npm ERR! path C:\Users\shuzi\Desktop\保密文件项目\test-ui/package.json npm ERR! errno -4058

    打开一个新的项目,因为当前项目文件夹下没有npm,"dev": "npm run start:dev",所以所以没有展示对应的运行图,如下图: 打开一个新的前端 ...

  8. C++ Concurrency in Action 读书笔记三:并发操作的同步

    Chapter 4 并发操作的同步·Synchronizing concurrent operations

  9. clickhouse在各大厂商的应用

    案例-ClickHouse在头条的技术演进

  10. AXI4从机总线分析验证之读取寄存器值

    AXI4从机总线分析验证之读取寄存器值 1.实验目的 利用前面所学的AXI4总线协议的理论分析,验证如何将一个PL的输入信号通过AXI发送到PS端.大致思路就是取一个按键,信号接入自建的AXI4的IP ...