新闻中心
C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建
答案是实现C++11线程池需用std::thread、std::queue、std::mutex和std::condition_variable;1. 创建线程数组和任务队列,用互斥锁保护共享数据,条件变量通知线程;2. 以std::function存储任务,通过enqueue添加;3. 工作线程循环等待任务,加锁取任务并执行;4. 析构时设停止标志,唤醒并join所有线程。

实现一个简单的线程池可以利用 C++11 提供的 std::thread、std::queue、std::condition_variable 和 std::mutex。核心思路是创建一组工作线程,它们在初始化后等待任务;任务通过队列提交,由条件变量通知线程执行。
1. 线程池的基本结构
线程池类通常包含以下成员:
- 线程数组:std::vector<:thread> 存储所有工作线程
- 任务队列:std::queue 存放待执行的任务(函数对象)
- 互斥锁:std::mutex 保护共享的任务队列
- 条件变量:std::condition_variable 用于唤醒等待任务的线程
- 停止标志:bool 标记线程池是否关闭
2. 任务类型与存储
使用 std::function
示例定义任务队列:
std::queue<:function>> tasks;std::mutex mtx;
std::condition_variable cv;
3. 工作线程逻辑
每个线程运行一个循环,从任务队列中取出任务并执行。如果没有任务,就等待条件变量。
关键点:
简小派
简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。
123
查看详情
- 加锁访问队列
- 使用 cv.wait() 阻塞,直到有新任务或停止信号
- 检查停止标志,避免虚假唤醒导致无限等待
线程主循环示例:
while (true) {std::function
{
std::unique_lock<:mutex> lock(mtx);
cv.wait(lock, [this] { return stop || !tasks.empty(); });
if (stop && tasks.empty()) break;
task = std::move(tasks.front());
tasks.pop();
}
task();
}
4. 添加任务和析构
提供一个模板方法 enqueue,将任意函数包装为任务加入队列:
templatevoid enqueue(F&& f) {
{
std::lock_guard<:mutex> lock(mtx);
tasks.emplace(std::forward
}
cv.notify_one();
}
析构函数需设置停止标志,唤醒所有线程,并 join 它们:
~ThreadPool() {{
std::lock_guard<:mutex> lock(mtx);
stop = true;
}
cv.notify_all();
for (auto& t : threads) {
t.join();
}
}
基本上就这些。这个线程池适合学习和轻量级任务调度,不复杂但容易忽略锁和条件变量的正确配合。
以上就是C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建的详细内容,更多请关注其它相关文章!
# 如果没有
# 成都哪个网站优化最好
# 东平网站建设哪里找
# 知名的餐饮行业网站推广
# 吉林品质网站建设
# 营口门户网站推广
# 菏泽营销推广怎样合作
# 泰州网站收费推广
# 营销推广的特点是什么呢
# 事件营销推广矩阵模型
# 张店广告推广招聘网站有哪些
# 解决问题
# c++11
# 中文网
# 相关文章
# 互斥
# 运算符
# 加锁
# 有什么区别
# 如何使用
# 如何实现
# c++
# ai
# c++线程池
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Shopware订单对象中获取产品自定义字段的正确方法
J*aScript数组对象转换:按指定键分组与值收集
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性
天眼查企业查询官网入口 天眼查官方网页版查询
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案
在Pyomo中实现基于变量的条件约束:Big-M方法详解
字由网在线版登录地址 字由网网页版安全入口
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
J*aScript动态修改指定div内所有a标签样式指南
win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
如何在CSS中使用浮动制作导航栏_float实现水平菜单
ArrayList与LinkedList核心操作的Big-O复杂度分析
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
抖音网页版快捷访问 抖音网页版网页版入口操作教程
sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
极兔快递快件信息查询系统 极兔快递官网运单号追踪
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择
Mac怎么锁定备忘录_Mac备忘录加密设置教程
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
如何在复杂的电商平台中优雅地管理共享资源并确保正确重定向,使用spryker-shop/resource-share-page模块助你一臂之力
多闪网页版在线观看免费入口_多闪官网访问入口
steam官方入口大全 steam账号注册及操作指南
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
fishbowl官网免费版 fishbowl养鱼网站入口
Django通过AJAX异步上传图片并保存至模型的完整指南
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
J*aScript map 迭代中检测空数组元素的有效方法
win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】
狙击外星人小游戏开始_狙击外星人小游戏立即开始
今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程
Animex动漫社网入口地址 Animex动漫社网正版在线入口
AO3同人作品网入口 AO3搜索引擎官网永久地址
处理嵌套交互式控件:前端可访问性指南
微信群消息显示延迟如何解决 微信群消息刷新优化方法
LINUX怎么设置定时任务_LINUX crontab配置教程
C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
微信网页版官方入口直达 微信网页版网页版登录使用方法
将HTML Canvas内容转换为可上传的图像文件(File对象)
c++如何使用chrono库处理时间_c++标准库时间与日期操作
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
CSS Box Model与弹性按钮:维持布局稳定的动画实践
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】


2025-12-07
浏览次数:次
返回列表