用了几天时间写了一个通用线程池,适用于linux和Windows,测试可用:
网上有类似,大概异曲同工吧~
下面源码部分为池部分,还有线程部分,锁部分,log部分需要的可以@我
贴代码:
/*====================================
* file: ws_thread_pool.h 文件
* anchor: wensheng
* date: 2016-05-12
* info: 线程池
* log: 1. 2016-05-12 wensheng create
======================================*/
#ifndef _WS_THREAD_POOL_H_
#define _WS_THREAD_POOL_H_
#include "../h/types.h"
#include "../ws_output_log_d/ws_log_output.h"
#include "ws_thread.h"
#include <cassert>
#include <vector>
#include <queue>
using namespace ws_log_output;
using namespace std;
namespace ws_thread
{
#define WS_THREAD_POOL_TASK_MAX (9999999) // 同时允许存在的任务数为9999999个
class ThreadPool;
// Task(任务)结构体
struct ThreadTask
{
WS_THREAD_FUNCTION m_fun; // 函数
void* m_para; // 参数
ThreadTask(WS_THREAD_FUNCTION afun = NULL, void *pPara = NULL) :m_fun(afun), m_para(pPara) {}
};
// 线程信息
struct ThreadInfo
{
Thread m_ThreadObj; // 线程对象
uint64_t m_StartTime; // 最后一次运行开始时间
uint32_t m_Count; // 运行次数
bool m_IsRunning; // 是不是正在运行
ThreadPool* m_Pool; //线程池的指针
ThreadInfo() :m_StartTime(0), m_Count(0), m_IsRunning(false) {}
};
// 线程池,(采用被动唤醒方式)
class ThreadPool
{
public:
//dwNum 线程池规模
ThreadPool(uint32_t dwNum = 4);
virtual ~ThreadPool();
// 添加任务到任务队列
bool addTheadTask(WS_THREAD_FUNCTION pFun, void* pObj);
//调整线程池规模
uint32_t updateThreadNum(int32_t aNum);
public:
bool EndAndWait(); //结束线程池, 并同步等待
bool End(); //结束线程池
uint32_t GetThreadNum(); // 线程总数
uint32_t GetRunningThreadNum(); // 运行中的线程数量
bool IsRunning(); // 判断是不是运行中
uint32_t GetTaskNum(); // 获取阻塞的任务个数
public:
std::queue<ThreadTask*> m_TaskQueue; // 任务队列
std::vector<ThreadInfo*> m_ThreadVector; // 线程队列,谁被激活就谁处理
WS_LOCK_CRITICAL m_ThreadLock; // 线程队列锁
WS_LOCK_CRITICAL m_TaskLock; // 任务队列锁
uint32_t m_lThreadNum; //总线程数
uint32_t m_lRunningNum; // 当前正在运行的线程数
WS_LOCK_SIGNAL m_SemaphoreCall; // 通知唤醒线程执行任务信号量
WS_LOCK_SIGNAL m_SemaphoreDel; // 通知删除线程信号量
WS_LOCK_POOL_EVENT m_EventStopThread; // 通知所有线程关闭(强制关闭)
WS_LOCK_POOL_EVENT m_EventWaitStopThread; // 通知所有线程关闭(等待完成所有任务在关闭)
WS_LOCK_POOL_EVENT m_EventPool; // 关闭线程池用
};
}
#endif /* _WS_THREAD_POOL_H_ */
/* ===================================分割线============================================== */
/*====================================
* file: ws_thread_pool.cpp 文件
* anchor: wensheng
* date: 2016-05-12
* info: 线程池
* log: 1. 2016-05-12 wensheng create
======================================*/
#include "ws_thread_pool.h"
#include<errno.h>
using namespace ws_thread;
#ifdef WS_WINDOWS
//工作线程
stat