【12】c++设计模式——>单例模式练习(任务队列)
- IT业界
- 2025-08-17 17:15:02

属性: (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(); }【12】c++设计模式——>单例模式练习(任务队列)由讯客互联IT业界栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【12】c++设计模式——>单例模式练习(任务队列)”