线程同步(7):linux和Windows线程池的实现-案例

用了几天时间写了一个通用线程池,适用于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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值