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;
}
相关推荐
言乐69 小时前
Python实现可运行解密游戏游戏框架
python·游戏·小程序·游戏程序·关卡设计
旖-旎9 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
Darkwanderor10 小时前
对Linux的进程控制的研究
linux·运维·c++
云泽80810 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
REDcker11 小时前
libdatachannel 快速入门
c++·webrtc·datachannel
second6012 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴12 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm13 小时前
linux之线程概念和控制
linux·开发语言·c++
hehelm13 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip
hansang_IR13 小时前
【记录】「SCOI2016」三道模拟赛/26.7.12
c++·算法