C++ 简单的任务队列详解
任务队列是指能够实现任务在多线程间安全传递的先入先出的队列。
任务是指组合了数据和操作的对象,这里面定义为CTask类的对象。
任务的实现:
Task.cpp
#include"stdafx.h" #include"Task.h" #include<iostream> usingnamespacestd; CTask::CTask(int*nCount) { m_nCount=nCount; } CTask::~CTask() { } voidCTask::DoWork() { (*m_nCount)++; cout<<"Count="<<*m_nCount<<endl; }
Task.h
#pragmaonce classCTask { int*m_nCount; public: CTask(int*nCount); ~CTask(); voidDoWork(); };
队列的实现:
TaskQueue.cpp
#include"stdafx.h" #include"TaskQueue.h" CTaskQueue::CTaskQueue() { } CTaskQueue::~CTaskQueue() { } //工作线程 voidCTaskQueue::WorkThread() { while(m_bIsStart) { if(!m_taskQueue.empty()) { CTask*it=m_taskQueue.front(); it->DoWork(); m_taskQueue.pop(); deleteit; } } } //向任务队列添加任务 boolCTaskQueue::Push(CTask*task) { if(task==nullptr) { returnfalse; } m_mutex.lock(); m_taskQueue.push(task); m_mutex.unlock(); returntrue; } //从任务队列获取任务 CTask*CTaskQueue::Pop() { CTask*it=nullptr; m_mutex.lock(); if(!m_taskQueue.empty()) { it=m_taskQueue.front(); m_taskQueue.pop(); } m_mutex.unlock(); returnit; } boolCTaskQueue::Start() { if(m_bIsStart) { returnfalse; } m_bIsStart=true; m_thread=std::thread(&CTaskQueue::WorkThread,this); returntrue; } voidCTaskQueue::Stop() { m_bIsStart=false; m_thread.join(); }
TaskQueue.h
#pragmaonce #include"Task.h" #include<queue> #include<mutex> #include<thread> classCTaskQueue { public: CTaskQueue(); ~CTaskQueue(); private: std::queue<CTask*>m_taskQueue;//任务队列 std::threadm_thread; std::mutexm_mutex; boolm_bIsStart;//线程是否开启 public: //工作线程 voidWorkThread(); //向任务队列添加任务 boolPush(CTask*task); //从任务队列获取任务 CTask*Pop(); //开启线程 boolStart(); //终止线程 voidStop(); };
测试demo:
//TaskQueue.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" #include"TaskQueue.h" #include"Task.h" voidMyWorkTask1(CTaskQueue*pTaskQueue,int*nCount) { for(size_ti=0;i<20;i++) { CTask*task=newCTask(nCount); pTaskQueue->Push(task); } } voidMyWorkTask2(CTaskQueue*pTaskQueue,int*nCount) { for(size_ti=0;i<20;i++) { CTask*task=newCTask(nCount); pTaskQueue->Push(task); } } int_tmain(intargc,_TCHAR*argv[]) { CTaskQueue*pTaskQueue=newCTaskQueue(); pTaskQueue->Start(); int*nCount=newint(0); std::threadthread1(&MyWorkTask1,pTaskQueue,nCount); std::threadthread2(&MyWorkTask2,pTaskQueue,nCount); //等待线程结束 if(thread1.joinable()) { thread1.join(); } if(thread2.joinable()) { thread2.join(); } system("pause"); return0; }
以上这篇C++简单的任务队列详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。