国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ 簡單的任務(wù)隊列詳解

2020-01-26 14:21:49
字體:
供稿:網(wǎng)友

任務(wù)隊列是指能夠?qū)崿F(xiàn)任務(wù)在多線程間安全傳遞的先入先出的隊列。

任務(wù)是指組合了數(shù)據(jù)和操作的對象,這里面定義為CTask類的對象。

任務(wù)的實(shí)現(xiàn):

Task.cpp

#include "stdafx.h"#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;}

Task.h

#pragma onceclass CTask{  int* m_nCount;public:  CTask(int* nCount);  ~CTask();  void DoWork();};

隊列的實(shí)現(xiàn):

TaskQueue.cpp

#include "stdafx.h"#include "TaskQueue.h"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;    }  }}//向任務(wù)隊列添加任務(wù)bool CTaskQueue::Push(CTask* task){  if (task == nullptr)  {    return false;  }  m_mutex.lock();  m_taskQueue.push(task);  m_mutex.unlock();  return true;}//從任務(wù)隊列獲取任務(wù)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();}

TaskQueue.h

#pragma once#include "Task.h"#include <queue>#include <mutex>#include <thread>class CTaskQueue{public:  CTaskQueue();  ~CTaskQueue();private:  std::queue<CTask*> m_taskQueue; //任務(wù)隊列  std::thread m_thread;  std::mutex m_mutex;  bool m_bIsStart;  //線程是否開啟public:  //工作線程  void WorkThread();   //向任務(wù)隊列添加任務(wù)  bool Push(CTask* task);  //從任務(wù)隊列獲取任務(wù)  CTask* Pop();  //開啟線程  bool Start();  //終止線程  void Stop();};

測試demo:

// TaskQueue.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。//#include "stdafx.h"#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 _tmain(int argc, _TCHAR* argv[]){  CTaskQueue* pTaskQueue = new CTaskQueue();  pTaskQueue->Start();  int* nCount = new int(0);  std::thread thread1(&MyWorkTask1, pTaskQueue, nCount);  std::thread thread2(&MyWorkTask2, pTaskQueue, nCount);  //等待線程結(jié)束  if (thread1.joinable())  {    thread1.join();  }  if (thread2.joinable())  {    thread2.join();  }  system("pause");  return 0;}

以上這篇C++ 簡單的任務(wù)隊列詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乐业县| 孝义市| 夹江县| 南投县| 苏州市| 中江县| 资中县| 滁州市| 兴仁县| 吐鲁番市| 肃南| 福贡县| 六盘水市| 阿尔山市| 柳林县| 灵山县| 会宁县| 酉阳| 崇明县| 循化| 江门市| 静海县| 舟曲县| 曲周县| 和平区| 工布江达县| 宝坻区| 五峰| 彰武县| 双鸭山市| 汝州市| 哈巴河县| 洛扎县| 陵川县| 新源县| 监利县| 合作市| 黄骅市| 毕节市| 孟津县| 兴安盟|