全网整合营销服务商

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

免费咨询热线: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 


相关文章: 佛山网站制作系统,佛山企业变更地址网上办理步骤?  建站之星3.0如何解决常见操作问题?  金*站制作公司有哪些,金华教育集团官网?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  制作网站的模板软件,网站怎么建设?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何挑选优质建站一级代理提升网站排名?  c# 在ASP.NET Core中管理和取消后台任务  如何在云指建站中生成FTP站点?  制作网站的软件免费下载,免费制作app哪个平台好?  中山网站制作网页,中山新生登记系统登记流程?  做企业网站制作流程,企业网站制作基本流程有哪些?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  盐城做公司网站,江苏电子版退休证办理流程?  北京网站制作网页,网站升级改版需要多久?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何高效生成建站之星成品网站源码?  nginx修改上传文件大小限制的方法  如何通过西部建站助手安装IIS服务器?  北京网站制作公司哪家好一点,北京租房网站有哪些?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  如何快速搭建高效服务器建站系统?  建站主机解析:虚拟主机配置与服务器选择指南  如何通过虚拟机搭建网站?详细步骤解析  建站为何优先选择香港服务器?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  成都网站制作报价公司,成都工业用气开户费用?  建站之星代理商如何保障技术支持与售后服务?  广州建站公司哪家好?十大优质服务商推荐  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  如何通过IIS搭建网站并配置访问权限?  中山网站推广排名,中山信息港登录入口?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  深圳网站制作的公司有哪些,dido官方网站?  网站图片在线制作软件,怎么在图片上做链接?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  python的本地网站制作,如何创建本地站点?  建站之星CMS五站合一模板配置与SEO优化指南  内网网站制作软件,内网的网站如何发布到外网?  制作网站公司那家好,网络公司是做什么的?  安云自助建站系统如何快速提升SEO排名?  如何配置支付宝与微信支付功能?  如何在香港服务器上快速搭建免备案网站?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  建站之星如何快速生成多端适配网站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  建站主机选择指南:服务器配置与SEO优化实战技巧 

您的项目需求

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