当前位置: 首页 > news >正文

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

属性:
(1)存储任务的容器,这个容器可以选择使用STL中的队列(queue)
(2)互斥锁,多线程访问的时候用于保护任务队列中的数据
方法:主要是对任务队列中的任务进行操作
(1)任务队列中任务是否为空
(2)往任务队列中添加一个任务
(3)从任务队列中取出一个任务
(4)从任务队列中删除一个任务
根据分析,就可以把这个饿汉模式的任务队列的单例类定义出来了:

#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();
}

在这里插入图片描述

http://www.dtcms.com/a/2153.html

相关文章:

  • Charles:移动端抓包 / windows客户端 iOS手机 / 手机访问PC本地项目做调试
  • R²决定系数
  • Day4:Linux系统编程1-60P
  • c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))
  • 多线程锁-synchronized字节码分析
  • 自动驾驶:未来的道路上的挑战与机遇
  • Python3入门教程||Python3 SMTP发送邮件
  • MySQL命令行中文乱码问题
  • 机器学习之旅-从Python 开始
  • 【LeetCode高频SQL50题-基础版】打卡第3天:第16~20题
  • 数据结构之堆,栈的实现
  • sheng的学习笔记-【中文】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第一周测验
  • 微信小程序点单左右联动的效果实现
  • 云原生边缘计算KubeEdge安装配置
  • 分层强化学习 综述论文阅读 Hierarchical Reinforcement Learning: A Comprehensive Survey
  • Postman使用实例
  • 手写Demo体验volatile可见性的作用
  • 计算机网络-计算机网络体系结构-物理层
  • 深度学习笔记之优化算法(三)动量法的简单认识
  • 设计模式之代理模式
  • 【运维笔记】Centos 7.5 安装 Docker详细步骤
  • 光伏发电预测(LSTM、CNN_LSTM和XGBoost回归模型,Python代码)
  • uniapp echarts 适配H5与微信小程序
  • 传统机器学习聚类算法——总集篇
  • kafka简易搭建(windows环境)
  • 使用postman 调用 Webservice 接口
  • Vue中如何进行数据可视化雷达图展示
  • 八大排序java
  • 阿里测试师用UI自动化测试实现元素定位!
  • 微服务技术栈-Gateway服务网关