日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++实现简单线程池代码

發布時間:2023/12/1 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++实现简单线程池代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 完整代碼
    • TaskPool.cpp
    • TaskPool.h
    • main.cpp

完整代碼

TaskPool.cpp

// // Created by LENOVO on 2021/10/25. //#include "TaskPool.h" #include <functional>std::mutex printMutex;TaskPool::TaskPool() : m_bRunning(false) {}TaskPool::~TaskPool() {removeAllTasks(); }void TaskPool::init(int threadNum/*= 5*/) {if (threadNum <= 0)threadNum = 5;m_bRunning = true;for (int i = 0; i < threadNum; i++) {std::shared_ptr<std::thread> spThread;// 這個bind含義是啥spThread.reset(new std::thread(std::bind(&TaskPool::threadFunc, this)));{std::lock_guard<std::mutex> guard(printMutex);std::cout << "Init a thread, id: "<< spThread->get_id() << std::endl;}m_threads.push_back(spThread);} }void TaskPool::stop() {m_bRunning = false;// 通知所有線程,不運行了m_cv.notify_all();// 等待所有線程退出for (auto& it : m_threads) {if (it->joinable())it->join();} }void TaskPool::addTask(Task *task) {std::shared_ptr<Task> spTask;spTask.reset(task);{// 將task加入隊列是互斥的std::lock_guard<std::mutex> guard(m_mutexList);m_taskList.push_back(spTask);}{std::lock_guard<std::mutex> guard(printMutex);std::cout << "add a Task, id: " << spTask->getID() << ", thread id is: " << std::this_thread::get_id() << std::endl;}// 通知一個線程的threadFuncm_cv.notify_one(); }void TaskPool::removeAllTasks() {{// 需要先互斥地將指向taskList的ptr重置,然后將整個taskList資源cleadstd::lock_guard<std::mutex> guard(m_mutexList);for (auto& it : m_taskList) {it.reset();}m_taskList.clear();} }void TaskPool::threadFunc() {std::shared_ptr<Task> spTask;while (true) {// 獲取task的過程是互斥的{ // 減少鎖的粒度std::unique_lock<std::mutex> guard(m_mutexList);// 如果任務隊列為空,那么就一直wait,等待線程被喚醒加入到隊列中while (m_taskList.empty()) {if (!m_bRunning)break;// 如果獲得了互斥鎖,但是條件不滿足// wait()會釋放鎖,掛起當前線程// 條件變量發生變化的時候,wait()將環型掛起的線程并獲得鎖m_cv.wait(guard);}if (!m_bRunning)break;// 獲取隊頭taskspTask = m_taskList.front();m_taskList.pop_front();}// 如果隊列為空,則重新進行嘗試獲取if (spTask == NULL)continue;// 否則,執行task任務spTask->doIt();// 完成之后,將指針重置spTask.reset();}std::lock_guard<std::mutex> guard(printMutex);std::cout << "exit thread , threadID:" << std::this_thread::get_id() << std::endl; }

TaskPool.h

// // Created by LENOVO on 2021/10/25. //#ifndef UNTITLED_TASKPOOL_H #define UNTITLED_TASKPOOL_H#include<thread> #include<mutex> #include<condition_variable> #include<list> #include<vector> #include<memory> #include<iostream>extern std::mutex printMutex;class Task{ private:unsigned int id; public:Task(unsigned int ID){id = ID;}virtual void doIt(){std::lock_guard<std::mutex> guard(printMutex);std::cout << "handle a task ,TaskID is: "<< id << ", thradID is:" << std::this_thread::get_id() << std::endl;}virtual ~Task(){std::lock_guard<std::mutex> guard(printMutex);std::cout << "a task destructed , TaskID is: "<< id << ", thradID is:" << std::this_thread::get_id() << std::endl;}unsigned int getID(){return id;} };class TaskPool final{ public:TaskPool();~TaskPool();TaskPool(const TaskPool& rhs) = delete;TaskPool& operator=(const TaskPool& rhs) = delete;public:// 初始化線程void init(int threadNum = 5);// 通知所有線程結束運行,并等待所有線程運行結束void stop();void addTask(Task* task);void removeAllTasks();private:void threadFunc();private:std::list<std::shared_ptr<Task>> m_taskList;std::mutex m_mutexList;std::condition_variable m_cv;bool m_bRunning;std::vector<std::shared_ptr<std::thread>> m_threads; };#endif //UNTITLED_TASKPOOL_H

main.cpp

#include<chrono> #include "TaskPool.h"int main() {TaskPool threadPool;threadPool.init();Task* task = NULL;for (int i = 0; i < 10; i++) {task = new Task(i);threadPool.addTask(task);}std::this_thread::sleep_for(std::chrono::seconds(5));threadPool.stop();return 0; }

總結

以上是生活随笔為你收集整理的c++实现简单线程池代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。