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(单例设计模式)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程