C++20线程池
本实现基于 C20 标准摒弃了传统的常规标志位与易错组件。以下是核心代码段的设计动机与原理为什么使用 std::jthread 而不是 std::threadstd::jthread 提供了自动汇合和协作式中断机制。它的析构函数会自动发出停止请求并阻塞等待线程结束彻底消除了传统 std::thread 忘记调用 join() 导致程序崩溃的隐患并且代码更简洁安全性更高。这看着像GC机制自动销毁往往伴随着一些代价虽然代价很小但在性能要求极高的场景极低延迟与高频交易系统硬实时系统高频短生命周期并发任务上面会体现出来。为什么不需要自定义 bool stop 标志位工作线程直接接收 std::stop_token。析构函数中遍历调用 request_stop()或者直接依赖 jthread 的自动机制st.stop_requested() 会安全地接管停止信号。这使得中断逻辑与操作系统底层的线程机制绑定更深代码更简洁。为什么条件变量等待的判断逻辑是 st.stop_requested() || !tasks.empty()且随后判断 st.stop_requested() tasks.empty()这是为了实现优雅降级。收到停止信号后线程不会立刻暴力退出而是会继续消耗队列中残留的任务。只有当既收到停止请求且任务队列被彻底清空时线程才会 return 结束。为什么必须用 std::shared_ptr 包装 std::packaged_task这是 C 线程池最经典的坑。任务队列的类型是 std::functionvoid()C 标准要求 std::function 内部持有的对象必须是可拷贝的CopyConstructible。但 std::packaged_task 作为一个管理异步状态的类是仅可移动的Move-Only。通过 std::make_shared 将其放到堆上Lambda 表达式按值捕获这个 shared_ptr发生拷贝从而完美满足了 std::function 的编译要求。为什么使用 requires std::invocableFunc, Args...利用 C20 的 Concepts 机制进行编译期约束。如果调用者传入了参数类型不匹配的函数编译器会在 enqueue 调用处直接报错而不是在深层模板实例化时抛出几百行的乱码错误极大提升了 API 的易用性。为什么 Lambda 捕获要写成 [fstd::forwardFunc(f), ...argsstd::forwardArgs(args)...]() mutable这是 C20 引入的带初始化器的包扩展捕获Pack expansion in lambda init-capture。它结合了完美转发确保任务入队时参数的左值/右值属性被完整保留到实际执行的那一刻。mutable 关键字则是因为 std::invoke 在执行某些带有内部状态的仿函数时可能需要修改捕获进来的按值变量。为什么入队时要判断 pool[0].get_stop_token().stop_requested()防止“死后入队”。当线程池生命周期即将结束析构函数已触发时如果其他线程还在尝试往池子里塞任务这些任务将永远不会被执行。直接抛出 std::runtime_error 可以在运行时尽早暴露时序 Bug。#include iostream #include thread #include condition_variable #include mutex #include functional #include vector #include queue #includefuture #includememory #include concepts #includestdexcept class ThreadPool { public: explicit ThreadPool(size_t n std::thread::hardware_concurrency()) { pool.reserve(n); for(size_t i0;in;i){ pool.emplace_back([this](std::stop_token st){ while(!st.stop_requested()){ std::functionvoid() task; { std::unique_lockstd::mutex lock(mu); c_v.wait(lock,[this,st](){return st.stop_requested()||!tasks.empty();}); if(st.stop_requested()tasks.empty())return; taskstd::move(tasks.front()); tasks.pop(); } task(); } }); } } ~ThreadPool() { for (auto t : pool) { t.request_stop(); } c_v.notify_all(); } templatetypename Func,typename ...Args requires std::invocableFunc,Args... auto enqueue(Func f,Args ...args)-std::futurestd::invoke_result_tFunc,Args...{ using retTypestd::invoke_result_tFunc,Args...; auto taskstd::make_sharedstd::packaged_task(retType()) ([fstd::forwardFunc(f),...argsstd::forwardArgs(args)...]()mutable{ return std::invoke(f,std::move(args)...);}); std::futureretType restask-get_future(); { std::unique_lockstd::mutexlock(mu); if (!pool.empty() pool[0].get_stop_token().stop_requested()) { throw std::runtime_error(enqueue on stopped ThreadPool); } tasks.emplace([task](){(*task)();}); } c_v.notify_one(); return res; } private: std::mutex mu; std::condition_variable c_v; std::vectorstd::jthread pool; std::queuestd::functionvoid() tasks; };

相关新闻

遥感云检测利器Fmask:单景多光谱影像的判据与工程调优

遥感云检测利器Fmask:单景多光谱影像的判据与工程调优

Fmask 这个算法在遥感圈子里不算新东西,但直到今天,做单张多光谱影像的云检测,它依然是绕不开的标杆。很多人一听说云检测,下意识就想用时间序列、多时相合成那套思路,但实际工程里更多时候你手里只有一景单时相影像&a…

2026/10/4 6:19:21 阅读更多 →
WeChat Intelligence Hub 旗舰 HTML 报告解析:一键生成可搜索、可打印的微信情报日报

WeChat Intelligence Hub 旗舰 HTML 报告解析:一键生成可搜索、可打印的微信情报日报

WeChat Intelligence Hub 旗舰 HTML 报告解析:一键生成可搜索、可打印的微信情报日报 【免费下载链接】wechat-intelligence-hub Local-first WeChat intelligence system with a read-only CLI, Codex skills, searchable chat history, daily briefings, follow-u…

2026/10/4 6:19:21 阅读更多 →
2026年自动备份云盘选型指南 核心核验维度与实用参考

2026年自动备份云盘选型指南 核心核验维度与实用参考

自动备份云盘核心需求与选型标准梳理当前个人数字化资产规模持续增长,文件跨设备流转、重要数据长期留存的需求愈发迫切,自动备份云盘已成为多数用户数字化生活的刚需工具。但当前市场上云盘产品能力参差不齐,不少用户在使用过程中遭遇各类问…

2026/10/4 6:19:21 阅读更多 →

最新新闻

QuickFix Java消息收发与查看实战指南

QuickFix Java消息收发与查看实战指南

1. 项目概述:为什么FIX协议的收发与查看是Java金融系统开发的“呼吸感”环节QuickFix Java 讲解(五)消息的收发与查看——这个标题里藏着一个被很多Java初学者低估、却被高频交易系统、券商柜台、基金估值引擎等真实生产环境反复锤炼的核心能…

2026/10/4 6:51:39 阅读更多 →
告警是真是假?Nearby Glasses 误报率、VR头显干扰与检测边界完整分析

告警是真是假?Nearby Glasses 误报率、VR头显干扰与检测边界完整分析

告警是真是假?Nearby Glasses 误报率、VR头显干扰与检测边界完整分析 【免费下载链接】yj_nearbyglasses attempting to detect smart glasses nearby and warn you 项目地址: https://gitcode.com/gh_mirrors/yj/yj_nearbyglasses 概要:Nearby Gl…

2026/10/4 6:51:39 阅读更多 →
chrome-devtools-mcp:让AI编码助手通过MCP协议直接操控浏览器

chrome-devtools-mcp:让AI编码助手通过MCP协议直接操控浏览器

1. 为什么需要让 AI 编码助手“看见”浏览器1.1 一个真实到让人抓狂的场景前端开发里有个场景几乎每个人都遇到过:你让 AI 编码助手帮你改一个按钮的样式,它信心满满地给你返回了一段 CSS,你复制粘贴进去,刷新页面,发现…

2026/10/4 6:51:39 阅读更多 →
Web播放H.265难?智能自适应渲染方案全解析

Web播放H.265难?智能自适应渲染方案全解析

跟视频播放死磕这些年,我最大的感受就是:Web播放H.265,真不是跑通一个demo那么简单。很多团队高高兴兴引入新格式,结果在用户真实浏览器里一测,不是黑屏就是卡成幻灯片。PowerPlayer这套带智能自适应渲染技术的播放方案…

2026/10/4 6:51:39 阅读更多 →
Spring 事务失效的常见场景

Spring 事务失效的常见场景

1. 引言 Spring 事务管理是 Java 后端开发中最常用的能力之一,但也是踩坑重灾区。很多同学在开发中遇到「明明加了 Transactional,数据却没回滚」的问题,排查半天才发现是事务根本没生效。本文梳理 Spring 事务失效的常见场景,从自…

2026/10/4 6:51:39 阅读更多 →
Madeira的dwrite unixlib如何拯救Steam文字渲染:一次静默失败的经典案例

Madeira的dwrite unixlib如何拯救Steam文字渲染:一次静默失败的经典案例

Madeira的dwrite unixlib如何拯救Steam文字渲染:一次静默失败的经典案例 【免费下载链接】Madeira Run x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT 项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira Madeira 是一款让 iPhon…

2026/10/4 6:50:39 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →