属性:
(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();
}