文章目录
- 前言
- 一、线程池是什么?
- 二、示例代码
前言
线程池主要是对之前内容的一个巩固,并且初步了解池化概念。
一、线程池是什么?
线程池就是提前开辟好一块空间,随时准备创造新线程来完成任务,可以理解为用空间来换时间,具体实现看以下示例代码。
二、示例代码
#include <pthread.h>
#include <cstdio>
#include <cstdlib>
#include "lockGuard.hpp"
#include "log.hpp"
const int default_ThreadNum = 5;
template <class T>
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 <= _thread_num; 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<Thread> &getpool(){return _threadPool;}static void *routine(void *args){ThreadData *td = (ThreadData *)args;ThreadPool<T> *tp = (ThreadPool<T> *)td->_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<Thread*> _threadPool;std::queue<T> _task_queue;pthread_mutex_t _mutex;pthread_cond_t _cond;
};