【12】c++设计模式——>单例模式练习(任务队列)

属性:

(1)存储任务的容器,这个容器可以选择使用STL中的队列(queue)

(2)互斥锁,多线程访问的时候用于保护任务队列中的数据

方法:主要是对任务队列中的任务进行操作

(1)任务队列中任务是否为空

(2)往任务队列中添加一个任务

(3)从任务队列中取出一个任务

(4)从任务队列中删除一个任务

根据分析,就可以把这个饿汉模式的任务队列的单例类定义出来了:

cpp 复制代码
#include <iostream>
#include <mutex>
#include <thread>
#include <queue>
using namespace std;

//创建一个饿汉模式单例
class TaskQueue
{
public:
	static TaskQueue* getInstance()
	{
		cout << "我是一个饿汉单例模式" << endl;
		return m_obj;
	}
	//任务队列是否为空
	bool isEmpty()
	{
		lock_guard<mutex> locker(m_mutex);
		return m_taskQ.empty();
	}
	//添加任务
	void pushTask(int task)
	{
		lock_guard<mutex> locker(m_mutex);
		m_taskQ.push(task);
	}
	//删除任务
	bool popTask()
	{
		lock_guard<mutex> locker(m_mutex);
		if (!m_taskQ.empty())
		{
			m_taskQ.pop();
			return true;
		}
		return false;
	}
	//取出来一个任务
	int getTask()
	{
		lock_guard<mutex> locker(m_mutex);
		if (!m_taskQ.empty())
		{
			return m_taskQ.front();
		}
		return -1;
	}
	
private:
	TaskQueue() = default; //无参构造
	static TaskQueue* m_obj; //单例
	queue<int> m_taskQ; //任务队列
	mutex m_mutex; //互斥锁
};
TaskQueue* TaskQueue::m_obj = new TaskQueue;

int main()
{
	
	//创建线程1(生产者)
	thread t1([]() {
		TaskQueue* obj = TaskQueue::getInstance();
		for (int i = 0; i < 10; i++)
		{
			obj->pushTask(i+100);
			cout << "taskID:" << i + 100 << ",threadID:" << this_thread::get_id() << endl;
			this_thread::sleep_for(chrono::microseconds(500));
		}
	});

	//创建线程2(消费者)
	thread t2([]() {
		TaskQueue* obj = TaskQueue::getInstance();
		this_thread::sleep_for(chrono::microseconds(100));
		while (!obj->isEmpty())
		{
			cout << "taskID:" <<obj->getTask()<< ",threadID:" << this_thread::get_id() << endl;
			obj->popTask();
			this_thread::sleep_for(chrono::microseconds(500));
		}
	});
	t1.join();
	t2.join();
}
相关推荐
Trouvaille ~4 分钟前
【优选算法篇】BFS 解决最短路——寻找最优路径的真谛
c++·算法·leetcode·面试·蓝桥杯·宽度优先·最短路问题
CoderCodingNo16 分钟前
【CSP】CSP-J 2025真题 | 多边形 luogu-P14360 (相当于GESP六级水平)
开发语言·c++·算法
Magic--24 分钟前
【LeetCode 27. 移除元素】C++ 范围 for 极简实现与原理解析
c++·算法·leetcode
旖-旎29 分钟前
位运算(只出现一次的数字|||)(5)
c++·算法·leetcode·位运算
kyle~36 分钟前
ROS2---客户端服务(rclcpp::Client)
c++·物联网·机器人·ros2
轻口味44 分钟前
HarmonyOS 6 自定义人脸识别模型8:MindSpore Lite框架介绍与使用
c++·华为·ai·harmonyos
IdahoFalls1 小时前
QT-Windows Kits-版本问题:【“_mm_loadu_si64”: 找不到标识符】解决方案[NEW]
开发语言·c++·windows·qt·算法·visual studio
承渊政道1 小时前
【优选算法】(实战掌握分治思想的使用方法)
数据结构·c++·笔记·vscode·学习·算法·leetcode
南境十里·墨染春水1 小时前
C++传记 this指针 及区分静态非静态成员(面向对象)
开发语言·jvm·c++·笔记
揽月凡尘1 小时前
基于 SWIG 的 C++ Embind 绑定自动化技术说明
开发语言·c++·自动化