C++任务队列

Task.h

cpp 复制代码
#pragma once
class CTask
{
	int* m_nCount;
public:
	CTask(int* nCount);
	~CTask();

	void DoWork();//具体的任务
};

Task.cpp

cpp 复制代码
#include "task.h"
#include <iostream>
using namespace std;

CTask::CTask(int* nCount)
{
	m_nCount = nCount;
}

CTask::~CTask()
{

}

void CTask::DoWork()
{
	(*m_nCount)++;
	 cout << "Count = " << *m_nCount << endl;
}

TaskQueue.h

cpp 复制代码
 #pragma once
 #include "Task.h"
 #include <queue>
 #include <mutex>
 #include <thread>

 class CTaskQueue
 {
 public:
	     CTaskQueue();
	     ~CTaskQueue();
	
 private:
	     std::queue<CTask*> m_taskQueue;  //任务队列
	     std::thread m_thread;
	     std::mutex m_mutex;
	     bool m_bIsStart;   //线程是否开启
	
 public:
	     //工作线程
		 void WorkThread();
	
		 //向任务队列添加任务
		 bool Push(CTask * task);
	     //从任务队列获取任务
		 CTask * Pop();
	
		 //开启线程
		 bool Start();
	     //终止线程
		 void Stop();
};

TaskQueue.cpp

cpp 复制代码
#include "TaskQueue.h"
#include <iostream>
CTaskQueue::CTaskQueue()
{
}

CTaskQueue::~CTaskQueue()
{
}

void CTaskQueue::WorkThread()
{
   while (m_bIsStart)
   {
     if (!m_taskQueue.empty())
     {
       CTask * it = m_taskQueue.front();
       it->DoWork();
       m_taskQueue.pop();
       delete it;
     }
   }
}

bool CTaskQueue::Push(CTask* task)
{
    if (task == nullptr)
    {
     return false;
    }

    m_mutex.lock();
    m_taskQueue.push(task);
    m_mutex.unlock();
    return true;
}

CTask* CTaskQueue::Pop()
{
    CTask* it = nullptr;

    m_mutex.lock();
    if (!m_taskQueue.empty())
    {
        it = m_taskQueue.front();
        m_taskQueue.pop();
    }
    m_mutex.unlock();
    return it;
}

bool CTaskQueue::Start()
{
    if (m_bIsStart)
    {
        return false;
    }
    m_bIsStart = true;
    //开启工作线程
    m_thread = std::thread(&CTaskQueue::WorkThread, this);
    return true;
}

void CTaskQueue::Stop()
{
    m_bIsStart = false;
    m_thread.join();
}

main.cpp

cpp 复制代码
#include "TaskQueue.h"
#include "Task.h"

void MyWorkTask1(CTaskQueue * pTaskQueue, int* nCount)
{
	     for (size_t i = 0; i < 20; i++)
		     {
		         CTask * task = new CTask(nCount);
		         pTaskQueue->Push(task);
		     }
}

 void MyWorkTask2(CTaskQueue * pTaskQueue, int* nCount)
 {
	    for (size_t i = 0; i < 20; i++)
		    {
		        CTask * task = new CTask(nCount);
		        pTaskQueue->Push(task);
		    }
 }

int main()
{
	   CTaskQueue * pTaskQueue = new CTaskQueue();
	   pTaskQueue->Start();
	
	   int* nCount = new int(0);

	   std::thread thread1(&MyWorkTask1, pTaskQueue, nCount);
	   std::thread thread2(&MyWorkTask2, pTaskQueue, nCount);
	
		//等待线程结束
		if (thread1.joinable())
		{
		      thread1.join();
		}
	    if (thread2.joinable())
		{
		        thread2.join();
		}
	
		system("pause");
	    return 0;
}
相关推荐
Beau_Will16 分钟前
数据结构-树状数组专题(1)
数据结构·c++·算法
hunandede1 小时前
av_image_get_buffer_size 和 av_image_fill_arrays
c++
尘浮生2 小时前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
怀澈1222 小时前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
chnming19873 小时前
STL关联式容器之set
开发语言·c++
威桑3 小时前
MinGW 与 MSVC 的区别与联系及相关特性分析
c++·mingw·msvc
熬夜学编程的小王3 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
yigan_Eins3 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
Mr.133 小时前
什么是 C++ 中的初始化列表?它的作用是什么?初始化列表和在构造函数体内赋值有什么区别?
开发语言·c++
阿史大杯茶3 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法