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++简单的任务队列详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。