新闻中心

C++如何实现一个简单的线程池_使用C++11 std::queue和std::condition_variable构建

2025-12-07
浏览次数:
返回列表
答案是实现C++11线程池需用std::thread、std::queue、std::mutex和std::condition_variable;1. 创建线程数组和任务队列,用互斥锁保护共享数据,条件变量通知线程;2. 以std::function存储任务,通过enqueue添加;3. 工作线程循环等待任务,加锁取任务并执行;4. 析构时设停止标志,唤醒并join所有线程。

c++如何实现一个简单的线程池_使用c++11 std::queue和std::condition_variable构建

实现一个简单的线程池可以利用 C++11 提供的 std::threadstd::queuestd::condition_variablestd::mutex。核心思路是创建一组工作线程,它们在初始化后等待任务;任务通过队列提交,由条件变量通知线程执行。

1. 线程池的基本结构

线程池类通常包含以下成员:

  • 线程数组:std::vector<:thread> 存储所有工作线程
  • 任务队列:std::queue 存放待执行的任务(函数对象)
  • 互斥锁:std::mutex 保护共享的任务队列
  • 条件变量:std::condition_variable 用于唤醒等待任务的线程
  • 停止标志:bool 标记线程池是否关闭

2. 任务类型与存储

使用 std::function 来包装任意可调用对象(如 lambda、函数指针等),放入队列中。

示例定义任务队列:

std::queue<:function>> tasks;
std::mutex mtx;
std::condition_variable cv;

3. 工作线程逻辑

每个线程运行一个循环,从任务队列中取出任务并执行。如果没有任务,就等待条件变量。

关键点:

简小派 简小派

简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。

简小派 123 查看详情 简小派
  • 加锁访问队列
  • 使用 cv.wait() 阻塞,直到有新任务或停止信号
  • 检查停止标志,避免虚假唤醒导致无限等待

线程主循环示例:

while (true) {
  std::function task;
  {
    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,将任意函数包装为任务加入队列:

template
void enqueue(F&& f) {
  {
    std::lock_guard<:mutex> lock(mtx);
    tasks.emplace(std::forward(f));
  }
  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配置指南【高手】 

搜索