最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++11 簡單實現(xiàn)線程池的方法

 更新時間:2020年10月27日 09:57:49   作者:輕風(fēng)々  
這篇文章主要介紹了C++11 簡單實現(xiàn)線程池的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

什么是線程池

線程池是一種多線程處理形式,處理過程中將任務(wù)添加到隊列,然后在創(chuàng)建線程后自動啟動這些任務(wù)。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優(yōu)先級運行,并處于多線程單元中。如果某個線程在托管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創(chuàng)建另一個輔助線程但線程的數(shù)目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。

不使用線程池有哪些弊端

創(chuàng)建太多線程,將會浪費一定的資源,有些線程未被充分使用。
銷毀太多線程,將導(dǎo)致之后浪費時間再次創(chuàng)建它們。
創(chuàng)建線程太慢,將會導(dǎo)致長時間的等待,性能變差。
銷毀線程太慢,導(dǎo)致其它線程資源饑餓。

線程池的組成部分

1、線程池管理器(ThreadPoolManager):用于創(chuàng)建并管理線程池
2、工作線程(WorkThread): 線程池中線程
3、任務(wù)接口(Task):每個任務(wù)必須實現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行。
4、任務(wù)隊列:用于存放沒有處理的任務(wù)。提供一種緩沖機制

下面直接看代碼實現(xiàn)

ThreadPoolManage.hpp

#pragma once
#include <thread>
#include <vector>
#include <queue>
#include <condition_variable>
#include <mutex>
/*
* 抽象一個任務(wù) 根據(jù)自己的需求擴展
*/
class AbsTask 
{
public:
 AbsTask() = default;
 virtual ~AbsTask() = default;
public:
 virtual void run() = 0;
};
template<class _Ty>
class ThreadPoolManage
{
public:
 ThreadPoolManage(unsigned int nMaxThread)
 :mMaxThreadNum(nMaxThread)
 , mThreadStatus(false)
 {
 //啟動的時候就要創(chuàng)建線程
 auto maxNum = std::thread::hardware_concurrency();
 //獲取當(dāng)前操作系統(tǒng)中CPU的核心數(shù)量 根據(jù)核心數(shù)量來設(shè)置 最大工作線程的并發(fā)數(shù)量
 mMaxThreadNum = mMaxThreadNum > maxNum ? maxNum : mMaxThreadNum;
 //創(chuàng)建工作線程池
 for (auto i = 0; i < mMaxThreadNum; i++)
 {
  mWorkers.emplace_back([this] {
  while (true)
  {
   std::unique_lock<std::mutex> lock(this->mQueue_mutex);
   this->mCondition.wait(lock, [this]() {return this->mThreadStatus || !this->mTasks.empty(); });
   if (this->mThreadStatus && this->mTasks.empty()) 
   { 
   return; 
   }
   //獲取隊列頭部的任務(wù)
   auto task = std::move(this->mTasks.front());
   //任務(wù)出隊
   this->mTasks.pop();
   //執(zhí)行工作
   task.run();
  }
  });
 }
 }
 ~ThreadPoolManage()
 {

 {
  std::unique_lock<std::mutex> lock(this->mQueue_mutex);
  this->mThreadStatus = true;
 }
 //通知所有線程起來工作 然后退出
 this->mCondition.notify_all();
 //等待所有線程工作完畢
 for (std::thread& worker : this->mWorkers) 
 {
  if (worker.joinable()) {
  worker.join();
  }
 }
 }
 /*
 * 添加任務(wù)到任務(wù)隊列
 */
 void addTask(_Ty& task)
 {
 std::unique_lock<std::mutex> lock(this->mQueue_mutex);
 if (mThreadStatus) {
  throw std::runtime_error("workers stop");
 }
 mTasks.emplace(std::move(task));
 mCondition.notify_one();
 }
private:
 /*
 * 工作線程池
 */
 std::vector<std::thread> mWorkers;
 /*
 * 任務(wù)隊列
 */
 std::queue<_Ty> mTasks;
 /*
 工作線程的最大并發(fā)數(shù)量
 */
 unsigned int mMaxThreadNum;
 /*
 條件變量 控制線程池中線程的工作狀態(tài)
 */
 std::condition_variable mCondition;
 /*
 * 工作線程鎖
 */
 std::mutex mQueue_mutex;
 /*
 * 控制線程的開關(guān) false 繼續(xù)工作 true 退出線程
 */
 bool mThreadStatus;

};

調(diào)用代碼

main.cpp

#include <iostream>
#include <chrono>
#include "ThreadPool.hpp"
class Task :public AbsTask
{
public:
 void run() override
 {
 std::this_thread::sleep_for(std::chrono::seconds(1));
 std::cout << "works ...... " << std::this_thread::get_id() << std::endl;
 }
};
int main()
{
 ThreadPoolManage<Task> ThreadPool(8);
 for (size_t i = 0; i < 256; i++)
 {
 Task task;
 ThreadPool.addTask(task);
 }
 std::cin.get();
 system("pause");
}

到此這篇關(guān)于C++11 簡單實現(xiàn)線程池的方法的文章就介紹到這了,更多相關(guān)C++11 線程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • qt實現(xiàn)倒計時示例

    qt實現(xiàn)倒計時示例

    這篇文章主要介紹了qt實現(xiàn)倒計時示例,需要的朋友可以參考下
    2014-05-05
  • 基于C++ OpenCV制作電子相冊查看器

    基于C++ OpenCV制作電子相冊查看器

    這篇文章主要介紹了如何使用OpenCV C++ 制作電子相冊查看器。類似于win10系統(tǒng)的“照片”功能。感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-01-01
  • Visual?Studio?2022使用MinGW來編譯調(diào)試C/C++程序的圖文教程

    Visual?Studio?2022使用MinGW來編譯調(diào)試C/C++程序的圖文教程

    這篇文章主要介紹了Visual?Studio?2022使用MinGW來編譯調(diào)試C/C++程序,以實例來簡單介紹一下VS2022中如何使用MinGW來編譯、調(diào)試C/C++程序,需要的朋友可以參考下
    2022-08-08
  • C++ const關(guān)鍵字的實例用法

    C++ const關(guān)鍵字的實例用法

    在本篇文章里小編給大家整理的是一篇關(guān)于C++ const關(guān)鍵字的實例用法,需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • c++與c中的數(shù)組初始化默認值如何為0

    c++與c中的數(shù)組初始化默認值如何為0

    這篇文章主要介紹了c++與c中的數(shù)組初始化默認值如何為0問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C/C++實現(xiàn)H264文件解析

    C/C++實現(xiàn)H264文件解析

    這篇文章主要為大家詳細介紹了如何通過C++實現(xiàn)H264文件以及一段H264碼流解析,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10
  • 總結(jié)c++性能優(yōu)化策略

    總結(jié)c++性能優(yōu)化策略

    在本篇文章中小編給大家總結(jié)了關(guān)于C++的性能優(yōu)化策略的相關(guān)知識點,對此有興趣的朋友可以參考學(xué)習(xí)下。
    2018-03-03
  • 詳解C++基礎(chǔ)——類繼承中方法重載

    詳解C++基礎(chǔ)——類繼承中方法重載

    這篇文章主要介紹了C++基礎(chǔ)——類繼承中方法重載,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C語言接口與實現(xiàn)方法實例詳解

    C語言接口與實現(xiàn)方法實例詳解

    這篇文章主要介紹了C語言接口與實現(xiàn)方法,包括接口的概念、實現(xiàn)方法及抽象數(shù)據(jù)類型等,并配合實例予以說明,需要的朋友可以參考下
    2014-09-09
  • C語言歸排與計排深度理解

    C語言歸排與計排深度理解

    這篇文章主要為大家詳細的介紹了C語言中計數(shù)排序和歸并排序,歸并排序是創(chuàng)建在歸并操作上的一種有效的排序算法,計數(shù)排序不用比較兩個數(shù)的大小,感興趣的朋友可以參考閱讀
    2023-04-04

最新評論

乐陵市| 沁源县| 苏尼特左旗| 永平县| 石狮市| 竹北市| 甘肃省| 宝兴县| 望城县| 正镶白旗| 无极县| 眉山市| 平和县| 西乌珠穆沁旗| 星座| 鹤岗市| 遵义市| 临武县| 光泽县| 石楼县| 桐梓县| 明光市| 湾仔区| 紫阳县| 荆门市| 酉阳| 临湘市| 景宁| 武隆县| 香港| 阳春市| 桐庐县| 仁寿县| 彩票| 建阳市| 八宿县| 合山市| 民乐县| 万全县| 土默特左旗| 万宁市|