c++实现简单线程池代码
生活随笔
收集整理的這篇文章主要介紹了
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_Hmain.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++实现简单线程池代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国产品牌里电视机选Vidda可以吗?这台
- 下一篇: C++多线程快速入门(五)简单线程池设计