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;
}
相关推荐
FrostedLotus·霜莲6 分钟前
C++主流编辑器特点比较
开发语言·c++·编辑器
liulilittle5 小时前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
十年编程老舅5 小时前
跨越十年的C++演进:C++20新特性全解析
c++·c++11·c++20·c++14·c++23·c++17·c++新特性
小刘同学3217 小时前
C++11 特性
c++·c11新特性
真的想上岸啊7 小时前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
m0_552200827 小时前
《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
c++·游戏·ue5
丁劲犇8 小时前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
charlie1145141919 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
呜喵王阿尔萨斯9 小时前
编程中的英语
c语言·c++