C++多线程学习笔记06(单例设计模式)
2022/1/15 17:07:09
本文主要是介绍C++多线程学习笔记06(单例设计模式),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、单例设计模式
概念:整个项目中,有某个或某些特殊的类,属于该类的对象只能创建一个。
MyCSC *p_a = MyCSC::GetInstance();//创建一个对象,返回该类对象的指针
MyCSC *p_b = MyCSC::GetInstance();//两个对象都指向同一个
二、单例设计模式共享数据问题分析、解决
面临问题:需要创建的线程(不是主线程)中来创建MyCSC这个单例类的对象,这种线程可能多个。
解决:面临GetIntance函数要互斥。
四、std::call_once(); 该函数参数二为一个函数名a()
功能:(1)能够保证函数a()只被调用一次;
(2)具备互斥量的能力 效率上比互斥量高,消耗少
(3)call_once()需要与标记std::once_flag使用 调用call_once 成功后, 标记为已调用状态
单例类
// 线程5.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; #include<thread> #include<mutex> class MyCSC //单列类 { private: MyCSC() {};//私有化构造函数,不能随便实列化,只能通过GetInstance() private: static MyCSC *m_imstance; public: static MyCSC *GetInstance() { if (m_imstance == NULL) { m_imstance = new MyCSC(); static CGarhuishou c1; } return m_imstance; } class CGarhuishou //类中套类 用类释放对象 { public: ~CGarhuishou() { if (MyCSC::m_imstance) { delete MyCSC::m_imstance; MyCSC::m_imstance = NULL; } } }; }; //类静态变量初始化 MyCSC *MyCSC::m_imstance = NULL; int main() { MyCSC *p_a = MyCSC::GetInstance();//创建一个对象,返回该类对象的指针 MyCSC *p_b = MyCSC::GetInstance();//两个对象都指向同一个 return 0; }
单例设计模式
// 线程5.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; #include<thread> #include<mutex> std::mutex resource_mutex; //创建的互斥量 class MyCSC //单列类 { private: MyCSC() {};//私有化构造函数 private: static MyCSC *m_imstance; public: static MyCSC *GetInstance() { //提高效率 //1)如果 if(m_instance!=NULL)条件成立,则肯定表示m_instance 已经被new 了 //2)如果 m_imstance == NULL ,不代表m_instance一定没被new过 if (m_imstance == NULL)//双头锁定(双重检查) { std::unique_lock<std::mutex> mymutex(resource_mutex); //自动加锁 if (m_imstance == NULL) { m_imstance = new MyCSC(); static CGarhuishou c1; } } return m_imstance; } class CGarhuishou //类中套类 用类释放对象 { public: ~CGarhuishou() { if (MyCSC::m_imstance) { delete MyCSC::m_imstance; MyCSC::m_imstance = NULL; } } }; }; //类静态变量初始化 MyCSC *MyCSC::m_imstance = NULL; //线程入口函数 void mythread() { cout << "我的线程开始执行" << endl; MyCSC *p_a = MyCSC::GetInstance(); cout << "我的线程执行结束" << endl; } int main() { thread obj1(mythread); thread obj2(mythread); obj1.join(); obj2.join(); return 0; }
std::call_once()
// 线程5.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; #include<thread> #include<mutex> std::once_flag a_flag;//系统定义标记 class MyCSC //单列类 { static void CreateInstance() //之被调用一次 { std::chrono::microseconds dura(20000); std::this_thread::sleep_for(dura); cout << "CreateInstance被执行一次" << endl; m_imstance = new MyCSC(); static CGarhuishou c1; } private: MyCSC() {};//私有化构造函数 private: static MyCSC *m_imstance; public: static MyCSC *GetInstance() { std::call_once(a_flag,CreateInstance);//两个线程同时执行到这,其中一个线程要等另外一个线程执行完毕CreateInstance cout << "call_once执行完毕" << endl; return m_imstance; } class CGarhuishou //类中套类 用类释放对象 { public: ~CGarhuishou() { if (MyCSC::m_imstance) { delete MyCSC::m_imstance; MyCSC::m_imstance = NULL; } } }; }; //类静态变量初始化 MyCSC *MyCSC::m_imstance = NULL; //线程入口函数 void mythread() { cout << "我的线程开始执行" << endl; MyCSC *p_a = MyCSC::GetInstance(); cout << "我的线程执行结束" << endl; } int main() { thread obj1(mythread); thread obj2(mythread); obj1.join(); obj2.join() return 0; }
我的线程开始执行
我的线程开始执行
CreateInstance被执行一次
call_once执行完毕
我的线程执行结束
call_once执行完毕
我的线程执行结束
请按任意键继续. . .
这篇关于C++多线程学习笔记06(单例设计模式)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-05feign默认connecttimeout和readtimeout是多少-icode9专业技术文章分享
- 2024-07-05idea控制台,日志太多,导致部分想看得日志被刷走 搜不到-icode9专业技术文章分享
- 2024-07-05The server selected protocol version Tls10 is not accepted by client preferences [TLs12]-icode9专业技术文章分享
- 2024-07-05怎么清理项目缓存-icode9专业技术文章分享
- 2024-07-04安装 Eyoucms详细图文教程-icode9专业技术文章分享
- 2024-07-04ueditor 复制文章时,图片的链接是一个下载图片地址,该如何处理?-icode9专业技术文章分享
- 2024-07-04怎样判断host有没有对wordpress有缓存呢-icode9专业技术文章分享
- 2024-07-04具有编译功能的系统make后,无法ssh连接-icode9专业技术文章分享
- 2024-07-04make后如何升级ssh-icode9专业技术文章分享
- 2024-07-03微信支付提示下单账户与支付账户不一致-icode9专业技术文章分享