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


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

    #include 
    #include 
    #include 
    #include 
    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    在这里插入图片描述

  • 相关阅读:
    1 selenium及环境安装
    SQL 入门指南:从零开始学习 SQL
    漏洞复现--EasyCVR智能边缘网关未授权访问
    Android MQTT:实现设备信息上报与远程控制
    数据持久化第七课-URL重写与Ajax
    软考 系统架构设计师 简明教程 | 软件开发模型
    STTextBox - 一个纯GDI开发的开源WinForm控件
    dd命令:用于读取、转换并输出数据
    【计算机网络笔记】Cookie技术
    剖析华为云Astro Platform技术价值与使用体验
  • 原文地址:https://blog.csdn.net/weixin_42097108/article/details/133564164