全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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::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. 工作线程逻辑

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

关键点:

  • 加锁访问队列
  • 使用 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();
  }
}

基本上就这些。这个线程池适合学习和轻量级任务调度,不复杂但容易忽略锁和条件变量的正确配合。


# ai  # c++  # if  # for  # while  # 析构函数  # auto  # break  # bool  # void  # 循环  # Lambda  # 指针  # class  # 线程  # Thread  # function  # 对象  # this  # 加锁  # 互斥  # 如果没有  # 提供一个  # 可以利用  # 中取  # 需用  # 新任务  # Courier  # vector 


相关文章: 建站OpenVZ教程与优化策略:配置指南与性能提升  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何选择适合PHP云建站的开源框架?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  建站之星后台密码遗忘如何找回?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  模具网站制作流程,如何找模具客户?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  建站之星如何实现五合一智能建站与营销推广?  如何在阿里云域名上完成建站全流程?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  如何将凡科建站内容保存为本地文件?  如何用西部建站助手快速创建专业网站?  建站主机选购指南:核心配置优化与品牌推荐方案  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  内部网站制作流程,如何建立公司内部网站?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何在七牛云存储上搭建网站并设置自定义域名?  网站专业制作公司有哪些,做一个公司网站要多少钱?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  南京网站制作费用,南京远驱官方网站?  广平建站公司哪家专业可靠?如何选择?  如何使用Golang安装API文档生成工具_快速生成接口文档  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  C++如何使用std::optional?(处理可选值)  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  建站之星图片链接生成指南:自助建站与智能设计教程  MySQL查询结果复制到新表的方法(更新、插入)  免费网站制作appp,免费制作app哪个平台好?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  已有域名如何快速搭建专属网站?  如何在景安服务器上快速搭建个人网站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  建站之星如何取消后台验证码生成?  Python文件管理规范_工程实践说明【指导】  如何在IIS服务器上快速部署高效网站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  宝塔面板如何快速创建新站点?  如何高效配置IIS服务器搭建网站?  如何快速生成ASP一键建站模板并优化安全性?  如何快速搭建自助建站会员专属系统?  javascript中的try catch异常捕获机制用法分析  导航网站建站方案与优化指南:一站式高效搭建技巧解析  实例解析Array和String方法  建站之星导航菜单设置与功能模块配置全攻略  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  如何有效防御Web建站篡改攻击?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。