#pragma once #include #include "TaskQueue.h" #include "TaskQueue.cpp" template class ThreadPool { public: // 创建线程池,在构造函数中初始化 ThreadPool(size_t min, size_t max); // 销毁线程池,在析构函数中 ~ThreadPool(); // 给线程池添加任务 void addTask(Task task); // 获取线程池中工作的线程的个数 size_t getWorkingThreads(); // 获取线程池中活着的线程的个数 size_t getALiveThreads(); // 获取线程池中任务队列中任务的个数 size_t getTaskNum(); private: // 如果想隐藏线程池里的线程函数,可以将线程函数设置私有权限 // note: 因为非静态成员声明时是没有函数地址的,解决方式: // 1. 将类成员函数设置成静态成员函数,这样在编译期间函数就有地址 // 2. 将线程函数声明在类外,通过友元引入到类中 // 说明:推荐第一种方式,更好的进行了封装,第二种方式破坏了封装的完整性 ///////////////////////////////////////////////////////////////////////// // 线程工作函数 static void* working(void* arg); // 线程管理者函数 static void* manager(void* arg); // 线程自杀函数 void threadExit(); private: // 任务队列 TaskQueue* m_taskQ; pthread_t managerID; // 管理者线程的ID pthread_t* pworkids; // 工作线程的ID,存放在一个数组中,由pworkids这个指针指向这个数组 size_t minNum; // 最小线程数量 size_t maxNum; // 最大线程数量 size_t busyNum; // 正在工作的线程的锁 size_t liveNum; // 存活的线程数量 int exitNum; // 根据实际情况计算需要销毁的线程数量 pthread_mutex_t mutexPool; // 整个线程池的锁 pthread_cond_t cond_Empty; // 任务队列是否为空的条件变量 pthread_cond_t cond_Full; // 任务队列是否超出了预设条件的条件变量 bool shutdown; // 是否销毁线程池 0 - 不销毁 \ 1 - 销毁 static const size_t DETECTNUM = 3; static const size_t CREATE_THREAD_NUM = 2; static const size_t EXIT_THREAD_NUM = 2; };