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

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

C++ 簡單的任務隊列詳解

2020-05-23 13:58:12
字體:
來源:轉載
供稿:網友

任務隊列是指能夠實現任務在多線程間安全傳遞的先入先出的隊列。

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

任務的實現:

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();};

隊列的實現:

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;    }  }}//向任務隊列添加任務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();}

TaskQueue.h

#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();};

測試demo:

// TaskQueue.cpp : 定義控制臺應用程序的入口點。//#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);  //等待線程結束  if (thread1.joinable())  {    thread1.join();  }  if (thread2.joinable())  {    thread2.join();  }  system("pause");  return 0;}

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 垣曲县| 漾濞| 平潭县| 桐城市| 石河子市| 泾阳县| 青浦区| 云浮市| 府谷县| 吴旗县| 洛宁县| 贵溪市| 平泉县| 遂昌县| 玉屏| 琼海市| 玛曲县| 沙坪坝区| 安康市| 益阳市| 利津县| 博爱县| 鄱阳县| 九龙县| 昌邑市| 隆昌县| 定襄县| 蒲江县| 云浮市| 陈巴尔虎旗| 尖扎县| 富源县| 卢氏县| 铁岭县| 临漳县| 竹山县| 沅陵县| 吴桥县| 麻栗坡县| 罗平县| 阿克陶县|