文章目录
- 前言
- 一、线程池是什么?
- 二、示例代码
前言
线程池主要是对之前内容的一个巩固,并且初步了解池化概念。
(图片来源网络,侵删)一、线程池是什么?
线程池就是提前开辟好一块空间,随时准备创造新线程来完成任务,可以理解为用空间来换时间,具体实现看以下示例代码。
二、示例代码
#include #include #include #include "lockGuard.hpp" #include "log.hpp" const int default_ThreadNum = 5; template class ThreadPool { public: ThreadPool(int thread_num = default_ThreadNum) :_thread_num(thread_num) { pthread_mutex_init(&_mutex,nullptr); pthread_cond_init(&_cond,nullptr); for (int i = 1; i char NAMEBuffer[128]; snprintf(nameBuffer, sizeof nameBuffer, "Thread %d", i); _threadPool.push_back(new Thread(nameBuffer, routine, (void *)this)); logMessage(NORMAL, "%s 线程创建成功!", nameBuffer); } } bool isEmpty() { return _task_queue.empty(); } void waitCond() { pthread_cond_wait(&_cond, &_mutex); } pthread_mutex_t &getMutex() { return _mutex; } T getTask() { T task = _task_queue.front(); _task_queue.pop(); return task; } std::vector return _threadPool; } static void *routine(void *args) { ThreadData *td = (ThreadData *)args; ThreadPool_args; while (1) { T task; { lockGuard lg(&tp->getMutex()); while (tp->isEmpty()) tp->waitCond(); task = tp->getTask(); } task(td->_name); } } void run() { for(auto& thread : _threadPool) { thread->start(); } } void pushTask(const T &task) { lockGuard lg(&_mutex); _task_queue.push(task); pthread_cond_signal(&_cond); } ~ThreadPool() { for(auto& iter: _threadPool) { iter->join(); delete iter; } pthread_mutex_destroy(&_mutex); pthread_cond_destroy(&_cond); } private: int _thread_num; std::vector _threadPool; std::queue _task_queue; pthread_mutex_t _mutex; pthread_cond_t _cond; };
(图片来源网络,侵删)