转载请注明: https://blog.csdn.net/Stephen___Qin/article/details/115583694

使用判断nullptr

#include <thread>
#include <iostream>
using namespace std; class Singleton
{
private:
Singleton()
{
} static Singleton * m_singleton;//C++类中不可以定义自己类的对象,但是可以定义自己类的指针和引用. public:
static Singleton * getInstance();
}; Singleton * Singleton::m_singleton = nullptr;
Singleton * Singleton::getInstance()
{
if(m_singleton == nullptr)
m_singleton = new Singleton(); return m_singleton;
} void ThreadFunc()
{
Singleton *s = Singleton::getInstance();
std::cout << "s:" << s << std::endl;
} int main()
{
thread t1(ThreadFunc);
t1.join(); thread t2(ThreadFunc);
t2.join(); thread t3(ThreadFunc);
t3.join(); return 0;
}

注意:

1.构造函数要定义为private,这样就无法创建对象,保证只能通过类名来访问单例.

2.static变量需要在类外初始化.为什么呢?因为静态变量不属于某个对象,而是属于类,如果放在类内初始化,则变成了这个对象的了,这就和之前的假设矛盾了

使用call_once

#include <thread>
#include <iostream>
#include <mutex>
using namespace std; static std::once_flag of; class Singleton
{
private:
Singleton()
{
} static Singleton * m_singleton; public:
static Singleton * getInstance();
}; Singleton * Singleton::m_singleton = nullptr; Singleton * Singleton::getInstance()
{
std::call_once(of, []()
{
m_singleton = new Singleton();
}
); return m_singleton;
} void ThreadFunc()
{
Singleton *s = Singleton::getInstance();
std::cout << "s:" << s << std::endl;
} int main()
{
thread t1(ThreadFunc);
t1.join(); thread t2(ThreadFunc);
t2.join(); thread t3(ThreadFunc);
t3.join(); return 0;
}

注意:

1.call_once和once_flag的头文件是<mutex>

2.once_flag定义为static或者全局对象,否则不同线程间不可见,则无法起到作用.

参考文章:

https://zhuanlan.zhihu.com/p/71900518

多线程安全的单例模式(使用判断nullptr和call_once两种方法)的更多相关文章

  1. js判断手机端操作系统的两种方法

    //判断手机端操作系统(Andorid/IOS),并自动跳转相应下载界面 androidURL ="http://xxx/xxx.apk"; var browser = { ver ...

  2. 链表有环判断,快慢指针两种方法/合并链表/删除重复元素/二分递归和while

    public static boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return fals ...

  3. WPF多线程UI更新——两种方法

    WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  4. Delphi Windows API判断文件共享锁定状态(OpenFile和CreateFile两种方法)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  5. 【java基础 13】两种方法判断hashmap中是否形成环形链表

    导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...

  6. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  7. js中判断对象类型的几种方法

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  8. 判断数组的方法/判断JS数据类型的四种方法

    参考文: 以下 3 个判断数组的方法,请分别介绍它们之间的区别和优劣Object.prototype.toString.call() . instanceof 以及 Array.isArray() h ...

  9. 使用c#检测文件正在被那个进程占用 判断文件是否被占用的两种方法

    C# 判断文件是否被占用的三种方法 using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.d ...

随机推荐

  1. Web SQL& IndexedDB

    Web SQL& IndexedDB https://developer.mozilla.org/en/docs/Web/API/IndexedDB_API https://mdn.githu ...

  2. 小程序 webview 自动打开新页面

    小程序 webview 自动打开新页面 iframe 效果 https://nervjs.github.io/taro/docs/components/open/web-view.html 怎么阻止小 ...

  3. puppeteer render local HTML template bug

    puppeteer render local HTML template bug ➜ url-to-poster git:(master) ✗ dev ^-v-^ app is running in ...

  4. windows10 WSL

    搭建WSL linux下的home目录,映射windows的目录地址 用户家目录 ➜ ~ pwd /home/ajanuw C:\Users\ajanuw\AppData\Local\Packages ...

  5. 手写一个webpack,看看AST怎么用

    本文开始我会围绕webpack和babel写一系列的工程化文章,这两个工具我虽然天天用,但是对他们的原理理解的其实不是很深入,写这些文章的过程其实也是我深入学习的过程.由于webpack和babel的 ...

  6. 通过setMouseTracking实现用鼠标拖动控件

    1 import sys 2 from PyQt5.Qt import * 3 4 class Mwindow(QWidget): 5 leftclick = False 6 7 def __init ...

  7. 数据库分表自增ID问题

    .................................................................................................... ...

  8. Go 去找个对象吧

    前言 我的读者中应该大部分都是 Java 从业者,不知道写 Java 这些年是否真的有找到对象? 没找到也没关系,总不能在一棵树上吊死,我们也可以来 Go 这边看看,说不定会有新发现. 开个玩笑,本文 ...

  9. 生成UUID的代码

    代码: String reqId = UUID.randomUUID().toString().replace("-", "");

  10. vue之v-for遍历下拉框select和单选框组radio-group

    1.v-for遍历下拉框 <el-form-item label="审核状态:" prop="status"> <el-select v-mo ...