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


![[激光原理与应用-71]:光电传感器的工作原理详解:光电效应原理、类型、光信号的光谱、电信号的频谱](https://img-blog.csdnimg.cn/ddc7d491b9d74497a37178bf118ccd07.png)











![[架构之路-228]:计算机硬件与体系结构 - 硬盘存储结构原理:如何表征0和1,即如何存储0和1,如何读数据,如何写数据(修改数据)](https://img-blog.csdnimg.cn/img_convert/ec8a420edd3c717b8212414255d52239.png)





