多线程安全的单例模式(使用判断nullptr和call_once两种方法)
2021-04-10 21:31
65 查看
转载请注明: 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; }ad8 [/code]
注意:
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或者全局对象,否则不同线程间不可见,则无法起到作用.
相关文章推荐
- 单例模式如何在多线程环境下保证安全—Double Checked Locking 模式使用
- 在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现。 【方法一】:使用 try{} catch{} 语句。 我们可以在try语句块中试图
- iOS 单例模式 学习 "52个方法 第6章 45条 使用 dispath_once 来执行只需运行一次的线程安全代码"
- 多线程环境下单例模式的两种实现方法
- c++11 call_once 使用方法
- JAVA实现多线程的两种方法,及如何使用
- C++11多线程中std::call_once的使用
- 1008: 级数求和(附:在使用for循环里的表达式二进行判断时的注意事项【两种求解方法】)
- java基于jxl.jar包生成Excel文件到指定目录和服务器下载两种模式的使用方法
- 关于DDD:管理"工作单元实例"的两种模式的使用方法
- 使用Object.prototype.toString.call()方法精确判断对象的类型
- [ggk itcast周六java]java多线程二种方法,及其安全。内部类及匿名类的使用方法。
- owb之使用OWB安全UI使目标方案称为OWB用户和repository assistant创建一个新用户两种方法作用都是一样的
- 判断Intent是否安全的方法queryIntentActivities的使用
- 线程安全的单例模式 -- 使用pthread_once一次初始化
- 使用JavaScript判断用户输入的是否为正整数(两种方法)
- 多线程之线程池的两种使用方法
- 通过JS和PHP两种方法判断用户请求时使用的浏览器类型
- 关于DDD:管理"工作单元实例"的两种模式的使用方法
- 禁止windows xp和2003使用F8进入安全模式的方法