开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
forked from Long_xu/cppThreadPool
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
main
分支 (1)
main
main
分支 (1)
main
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
main
分支 (1)
main
cppThreadPool
/
src
/
cppThreadPool.h
cppThreadPool
/
src
/
cppThreadPool.h
cppThreadPool.h 4.25 KB
一键复制 编辑 原始数据 按行查看 历史
Long_xu 提交于 2023年01月29日 17:23 +08:00 . src
#ifndef _CPP_THREAD_POOL_H_
#define _CPP_THREAD_POOL_H_
#include <iostream>
#include <functional>
#include <memory>
#include <queue>
#include <mutex>
#include <vector>
#include <thread>
#include <future>
#ifdef WIN32
#include <windows.h>
#else
#include <sys/time.h>
#endif
using namespace std;
void getNow(timeval *tv);
int64_t getNowMs();
#define TNOW getNow()
#define TNOWMS getNowMs()
class CPP_ThreadPool{
protected:
struct TaskFunc{
TaskFunc(uint64_t expireTime):_expireTime(expireTime){}
int64_t _expireTime=0;//超时的绝对时间
function<void()> _func;
};
typedef shared_ptr<TaskFunc> TaskFuncPtr;
/*
* @brief 获取任务 **
*@return TaskFuncPtr
*/
bool get(TaskFuncPtr& task);
/*
* @brief 线程池是否退出
*/
bool isTerminate()
{
return _bTerminate;
}
/*
* @brief 线程运行态
*/
void run();
public:
/*
* @brief 构造函数
*/
CPP_ThreadPool();
/*
* @brief 析构, 会停止所有线程
*/
virtual ~CPP_ThreadPool();
/*
* * @brief 初始化.
* * @param num 工作线程个数
*/
bool init(size_t num);
/*
* @brief 停止所有线程, 会等待所有线程结束
*/
void stop();
/*
* @brief 启动所有线程
*/
bool start();
/*
* @brief 等待当前任务队列中, 所有工作全部结束(队列无任务).
* @param millsecond 等待的时间(ms), -1:永远等待
* @return true, 所有工作都处理完毕
* false,超时退出
*/
bool waitForAllDone(int millsecond=-1);
/*
* @brief 获取线程个数.
* @return size_t 线程个数
*/
size_t getThreadNum()
{
unique_lock<mutex> lock(_mutex);
return _threads.size();
}
/*
* @brief 获取当前线程池的任务数
* @return size_t 线程池的任务数
*/
size_t getJobNum()
{
unique_lock<mutex> lock(_mutex);
return _tasks.size();
}
/*
* @brief 用线程池启用任务(F是function, Args是参数) **
* @param ParentFunctor
* @param tf
* @return 返回任务的future对象, 可以通过这个对象来获取返回值
*/
template <class F,class... Args>
auto exec(F&& f, Args&&... args)->future<decltype(f(args...))>
{
return exec(0,f,args...);
}
/*
* unused.
*
* @brief 用线程池启用任务(F是function, Args是参数)
* @param 超时时间 ,单位ms (为0时不做超时控制) ;若任务超时,此任务将被丢弃
* @param bind function
* @return 返回任务的future对象, 可以通过这个对象来获取返回值
*
* template <class F, class... Args>
* 它是c++里新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数
* auto exec(F &&f, Args &&... args) -> std::future<decltype(f(args...))>
* std::future<decltype(f(args...))>:返回future,调用者可以通过future获取返回值
* 返回值后置
*/
template<class F,class... Args>
auto exec(int64_t timeoutMs,F&& f,Args&&... args) -> future<decltype(f(args...))>
{
//获取现在时间
int64_t expireTime=(timeoutMs==0)?0:TNOWMS+timeoutMs;
// 定义返回值类型
using retType=decltype(f(args...));
// 封装任务
auto task=make_shared<packaged_task<retType()>>(bind(forward<F>(f),forward<Args>(args)...));
// 封装任务指针,设置过期时间
TaskFuncPtr fPtr=make_shared<TaskFunc>(expireTime);
fPtr->_func=[task](){
(*task)();
};
unique_lock<mutex> lock(_mutex);
// 插入任务
_tasks.push(fPtr);
// 唤醒阻塞的线程,可以考虑只有任务队列为空的情 况再去notify
_condition.notify_one();
return task->get_future();
}
protected:
size_t _threadNum;//线程数量
bool _bTerminate;//判定是否终止线程池
mutex _mutex; //唯一锁
vector<thread*> _threads; //工作线程数组
queue<TaskFuncPtr> _tasks; //任务队列
condition_variable _condition;//条件变量
atomic<int> _atomic{0};//原子变量
};
#endif
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

C++实现的线程池,涉及以下知识点: decltype。 packaged_task。 make_shared。 mutex。 unique_lock。 notify_one。 future。 queue。 bind。 thread。 等等。
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/outspace/cppThreadPool.git
git@gitee.com:outspace/cppThreadPool.git
outspace
cppThreadPool
cppThreadPool
main
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /