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

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

 更新時間:2020年05月06日 11:04:42   作者:十面埋伏但莫慌  
這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)線程池的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

最近自己寫了一個線程池。

總的來說,線程池就是有一個任務(wù)隊列,一個線程隊列,線程隊列不斷地去取任務(wù)隊列中的任務(wù)來執(zhí)行,當(dāng)任務(wù)隊列中為空時,線程阻塞等待新的任務(wù)添加過來。

我是用queue來存放任務(wù),vector存放thread*,然后用condition_variable 來設(shè)置線程阻塞和喚醒。

下面直接上代碼吧。

線程池類頭文件Thread_Pool.h

/********************************************
   線程池頭文件

  Author:十面埋伏但莫慌
  Time:2020/05/03

*********************************************/
#pragma once
#ifndef _THREAD_POOL_H_
#define _THREAD_POOL_H_
#include<thread>
#include<queue>
#include<mutex>
#include<atomic>
#include<vector>
#include<condition_variable>

typedef std::function<void()> Func;//定義線程執(zhí)行函數(shù)類型,方便后面編碼使用。
//任務(wù)類
class Task {
public:
 Task() {}
 ~Task() {}
 int push(Func func);//添加任務(wù);
 int getTaskNum();//獲得當(dāng)前隊列中的任務(wù)數(shù);
 Func pop();//取出待執(zhí)行的任務(wù);
public:
 std::mutex mx;//鎖;
private:
 
 std::queue<Func> tasks;//任務(wù)隊列
};
//線程池類
class Thread_Pool {
public:
 Thread_Pool() :IsStart(false) {}
 ~Thread_Pool();
 int addTasks(Func tasks);//添加任務(wù);
 void start();//開啟線程池;
 void stop();//關(guān)閉線程池;
 void run();//線程工作函數(shù);
 int getTaskNum();//獲得當(dāng)前隊列中的任務(wù)數(shù);
private:
 static const int maxThreadNum = 3;//最大線程數(shù)為3;

 std::condition_variable cond;//條件量;
 std::vector<std::thread*> threads;//線程向量;
 std::atomic<bool> IsStart;//原子變量,判斷線程池是否運(yùn)行;
 Task tasks;//任務(wù)變量;
};
#endif

然后是線程池類成員函數(shù)定義文件Thread_Pool.cpp

/********************************************
   線程池CPP文件

  Author:十面埋伏但莫慌
  Time:2020/05/03

*********************************************/
#include"Thread_Pool.h"
#include<iostream>
int Task::push(Func func) {
 std::unique_lock<std::mutex> lock(mx);
 try {
  tasks.emplace(func);
 }
 catch (std::exception e)
 {
  throw e;
  return -1;
 }
 return 0;
}
int Task::getTaskNum()
{
 return tasks.size();
}
Func Task::pop() {
 std::unique_lock<std::mutex> lock(mx);
 Func temp;
 if (tasks.empty())
  return temp;
 else
 {
  temp = tasks.front();
  tasks.pop();
  return temp;
 }
}
int Thread_Pool::addTasks(Func func)
{
 
 int ret = tasks.push(func);
 cond.notify_one();
 return ret;
}
void Thread_Pool::start() {
 if (!IsStart) {
  IsStart = true;
  for (int i = 0; i < maxThreadNum; i++)
  {
   threads.emplace_back(new std::thread(std::bind(&Thread_Pool::run,this)));   
  }
  
 }
}
void Thread_Pool::run()
{
 while (IsStart)
 {
  Func f;
  if (tasks.getTaskNum() == 0 && IsStart)
  {
   std::unique_lock<std::mutex> lock(tasks.mx);
   cond.wait(lock);
  }
  if (tasks.getTaskNum() != 0 && IsStart)
  {
   f = tasks.pop();
   if(f)
    f();
  }

 }
}
int Thread_Pool::getTaskNum() {
 return tasks.getTaskNum();
}
void Thread_Pool::stop() {

  IsStart = false;
  cond.notify_all();
  for (auto T : threads) {
   std::cout << "線程 " << T->get_id() << " 已停止。" << std::endl;
   T->join();
   if (T != nullptr)
   {
    delete T;
    T = nullptr;
   }
  }
 std::cout << "所有線程已停止。" << std::endl;
}
Thread_Pool::~Thread_Pool() {
 if (IsStart)
 {
  stop();
 }
}

最后是測試用的main.cpp

#include<iostream>
#include"Thread_Pool.h"
using namespace std;
void string_out_one() {
 cout << "One!" << endl;
}
void string_out_two() {
 cout << "Two!" << endl;
}
void string_out_three() {
 cout << "Three!" << endl;
}
int main() {
 {
  Thread_Pool Pool;
  try {
   Pool.start();
  }
  catch (std::exception e)
  {
   throw e;
   cout << "線程池創(chuàng)建失敗。" << endl;
  }
  for (int i = 0; i < 50000 ;)
  {  
   if (Pool.getTaskNum() < 1000) {
    Pool.addTasks(string_out_one);
    Pool.addTasks(string_out_two);
    Pool.addTasks(string_out_three);
    std::cout << i++ << std::endl;
   }
  }
  getchar();
 }
 getchar();
 return 0;
}

執(zhí)行的效果如下:

線程喚醒和阻塞的邏輯就是在線程工作函數(shù)run函數(shù)中,判斷隊列是否為空,若為空則設(shè)置鎖并調(diào)用condition變量的wait函數(shù),釋放這個線程中的鎖并阻塞線程,等待任務(wù)隊列中新的任務(wù)添加進(jìn)來后,

condition變量通過notify_one()隨機(jī)喚醒一個在wait的線程,取出隊列中的任務(wù)執(zhí)行。

寫這個線程池的過程中碰到的最主要需要注意的就是鎖的使用,在對隊列的寫和釋放時要注意加鎖,在需要阻塞線程時,要注意通過{}設(shè)置鎖的范圍。

IsStart是原子的,所以在寫這個變量的時候沒有另外加鎖。

目前我覺得這個線程池的缺陷就是可執(zhí)行函數(shù)的類型被寫死了,有嘗試對Task類使用模板類,但是在Thread_Pool中還是要指明Task模板類的類型參數(shù),要是有大神指點下就好了- -。

就先記錄這么多,感覺這個線程池的還是有很多可以改進(jìn)的地方的,也歡迎大家指出不足。

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

相關(guān)文章

  • 深入淺析 C++ 調(diào)用 Python 模塊

    深入淺析 C++ 調(diào)用 Python 模塊

    Python 提供了 C++ 庫,使得開發(fā)者能很方便地從 C++ 程序中調(diào)用 Python 模塊。接下來通過本文給大家介紹 C++ 調(diào)用 Python 模塊的相關(guān)知識,需要的朋友參考下吧
    2016-03-03
  • C++表達(dá)式求值詳解

    C++表達(dá)式求值詳解

    下面小編就為大家?guī)硪黄獪\談C++ 語言中的表達(dá)式求值。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • C語言實現(xiàn)學(xué)生信息管理系統(tǒng)

    C語言實現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 詳解C語言之文件操作(上)

    詳解C語言之文件操作(上)

    這篇文章主要介紹了關(guān)于C語言文件操作方法的相關(guān)資料,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • 用C/C++實現(xiàn)linux下檢測網(wǎng)絡(luò)接口狀態(tài)

    用C/C++實現(xiàn)linux下檢測網(wǎng)絡(luò)接口狀態(tài)

    這篇文章主要為大家詳細(xì)介紹了用c/c++實現(xiàn)linux下檢測網(wǎng)絡(luò)接口狀態(tài),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C++中map和set的簡介及使用詳解

    C++中map和set的簡介及使用詳解

    本文主要介紹了C++中map和set的簡介及使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言對結(jié)構(gòu)體數(shù)組按照某項規(guī)則進(jìn)行排序的實現(xiàn)過程探究

    C語言對結(jié)構(gòu)體數(shù)組按照某項規(guī)則進(jìn)行排序的實現(xiàn)過程探究

    這篇文章主要介紹了C語言對結(jié)構(gòu)體數(shù)組按照某項規(guī)則進(jìn)行排序的實現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • C語言實現(xiàn)簡單學(xué)生學(xué)籍管理系統(tǒng)

    C語言實現(xiàn)簡單學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單學(xué)生學(xué)籍管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++從零配置ffmpeg的詳細(xì)過程

    C++從零配置ffmpeg的詳細(xì)過程

    本博文源于筆者正在做的任務(wù),將視頻mp4每幀轉(zhuǎn)換成jpg格式,前提是需要配置ffmpeg,因此本文從0下載教讀者如何配置ffmpeg,文中通過圖文結(jié)合的方式給大家介紹得非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 如何使用C++結(jié)合OpenCV進(jìn)行圖像處理與分類

    如何使用C++結(jié)合OpenCV進(jìn)行圖像處理與分類

    在計算機(jī)視覺領(lǐng)域,OpenCV與C++結(jié)合能高效處理和分類圖像,C++的高執(zhí)行效率適合大規(guī)模數(shù)據(jù)處理,OpenCV提供豐富的功能,如圖像預(yù)處理和機(jī)器學(xué)習(xí)算法,安裝OpenCV需要配置環(huán)境和添加庫文件,本文詳細(xì)介紹了使用C++和OpenCV進(jìn)行圖像分類的過程,包括使用SVM和深度學(xué)習(xí)模型
    2024-09-09

最新評論

都昌县| 黔东| 南木林县| 西畴县| 闸北区| 长沙县| 瑞安市| 莆田市| 屏山县| 资源县| 石景山区| 铁力市| 禹城市| 安仁县| 灌阳县| 南靖县| 朝阳市| 太谷县| 沅江市| 宁明县| 岳阳市| 高邮市| 周至县| 南投市| 卫辉市| 石阡县| 西乌| 广元市| 阿勒泰市| 丰城市| 罗源县| 滁州市| 旌德县| 桃江县| 固始县| 汝州市| 厦门市| 绥滨县| 运城市| 腾冲县| 菏泽市|