登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
1
2
/ 2 页
下一页
返回列表
首页
›
业界区
›
业界
›
从源码角度解析C++20新特性如何简化线程超时取消 ...
从源码角度解析C++20新特性如何简化线程超时取消
[ 复制链接 ]
国语诗
2025-12-23 02:00:08
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
C++20中增加了很多重量级新特性,它不仅带来了ranges、concept和协程,也为多线程编程带来了jthread和stop_source这些强力辅助。利用这些新特性,我们可以更高效地编写并发程序。
今天要说的就是利用jthread和stop_source来简化线程超时控制的实现,最终我们可以实现一个简单高效、可维护性不输给号称“天生支持并发”的Go语言的版本。
为什么需要超时控制
超时控制是很常见的需求,最普遍的场景是为了防止程序卡住或者长时间占用资源,程序会主动取消掉一些超过允许运行时间的或者无响应的线程,比如一些耗时很长的网络连接处理线程等。当然用户等得不耐烦了手动点击取消任务执行也勉强可以算在内。
通常超时发生或者用户点击取消之后,我们都期待线程能迅速终止执行并让整个程序保持一个完整且安全的状态。然而现实是复杂的,想实现上述功能对于线程来说是一件难事,尤其在Linux系统上。
第一个难点是如何让线程知道自己要退出。对于进程来说这不是难点,因为不管进程在做什么,我们都可以靠向其发送信号来立即中断进程的执行(前提是线程没有屏蔽这个信号),这样进程的停止请求可以被立即感知到,进程从而可以尽快完成善后工作退出执行。同样的招数对多线程程序来说就没那么好用了——信号默认是发给整个进程的,为了能让每个线程独立地接收信号,我们需要保存线程的标识符并在每个线程中设置接收和屏蔽信号的mask,这大大增加了程序的复杂性;其次信号处理函数是整个进程内所有线程共享的,我们需要额外的手段来保证并发安全,同时还得兼顾信号处理函数需要可重入、快速执行的最佳实践,这会提高程序的开发难度。
第二个难点在于如何保证线程一定会退出执行。前面说到信号可以打断进程的执行,但这只是通知,实际上进程完全可以在信号处理函数返回后无视这个通知继续运行,或者有一种更普遍的场景——程序正好卡在某个系统调用上,而程序又设置了系统调用被信号中断后自动重启,这样即使我们有效通知了进程,进程也会在收完通知之后再次进入系统调用从而无法响应停止请求。所以作为保底手段,Linux可以发送SIGKILL这个信号强制终止进程,这个信号无法捕获也无法屏蔽,是我们货真价实的“底牌”。
上述的情况在多线程中同样存在,而且我们没有“底牌”可用——因为不管给哪个线程发送SIGKILL,都会杀死整个进程而不是单独接收到信号的那个线程。另外即使有办法强制终止线程(比如早期的JVM),我们还会遇到资源释放的问题。进程退出执行之后,内核会尽可能释放进程持有的所有资源,打开的文件会被关闭,缓冲区的内容会被刷新,文件锁之类的同步机制也会正常解锁;但线程并没有这种自动清理机制,清理工作完全需要手动执行,一旦进程没有释放自己持有的资源就退出,系统就会遇到各种数据损坏和死锁等并发问题,排查和修复会极其困难。
为了克服上述难点并安全高效地实现终止超时线程的执行,我们需要一些额外的控制手段。这也一直都是开发者中的热门话题。
在介绍C++20如何简化超时控制之前,我们先来看看前人的智慧成果。
Golang实现超时控制
Golang是天生支持并发的语言,这一点可谓名副其实,尤其是在超时控制上。
我们直接看个例子,例子里有主线程和工作线程,工作线程超时时间为5秒,如果超过这个时间还有线程没完成工作,就取消所有线程的执行。Golang里没有系统级的线程,但我们可以用goroutine模拟。
在工作线程中我们用sleep代替耗时的工作,这样便于测试:
[code]func Work(ctx context.Context, id int) error { for range 10 { select { case
源码
角度
解析
新特性
特性
相关帖子
Claude Code的源码泄露
【OpenClaw】通过 Nanobot 源码学习架构---(2)外层控制逻辑
【节点】[Log节点]原理解析与实际应用
刚刚 Claude Code 源码泄露!我扒出了 11 个隐藏秘密
FastAPI + Celery 实战:异步任务里调用 Redis 和数据库的全解析,及生产级组织方案
【OpenClaw】通过 Nanobot 源码学习架构---(3)AgentLoop
【节点】[Negate节点]原理解析与实际应用
【节点】[Normalize 节点]原理解析与实际应用
【OpenClaw】通过 Nanobot 源码学习架构 ---(4)SubAgent
【节点】[Posterize节点]原理解析与实际应用
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
科技
Claude Code的源码泄露
7
63
啖曼烟
2026-04-01
业界
【OpenClaw】通过 Nanobot 源码学习架构---(2)外层控制逻辑
5
260
拼潦
2026-04-01
安全
【节点】[Log节点]原理解析与实际应用
1
475
凉砧掌
2026-04-02
业界
刚刚 Claude Code 源码泄露!我扒出了 11 个隐藏秘密
2
957
诸婉丽
2026-04-02
业界
FastAPI + Celery 实战:异步任务里调用 Redis 和数据库的全解析,及生产级组织方案
2
789
涂流如
2026-04-02
业界
【OpenClaw】通过 Nanobot 源码学习架构---(3)AgentLoop
0
189
些耨努
2026-04-03
安全
【节点】[Negate节点]原理解析与实际应用
1
750
电棘缣
2026-04-04
安全
【节点】[Normalize 节点]原理解析与实际应用
1
528
少琼
2026-04-05
业界
【OpenClaw】通过 Nanobot 源码学习架构 ---(4)SubAgent
0
598
府扔影
2026-04-06
安全
【节点】[Posterize节点]原理解析与实际应用
0
354
恿深疏
2026-04-06
回复
(34)
谅潭好
2026-1-1 11:30:56
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢,下载保存了
窟聿湎
2026-1-12 10:22:46
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
用心讨论,共获提升!
空娅芬
2026-1-15 10:57:27
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
过来提前占个楼
盗衍
2026-1-18 08:56:13
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
感谢分享,学习下。
袁勤
2026-1-18 13:08:12
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
喜欢鼓捣这些软件,现在用得少,谢谢分享!
痕厄
2026-1-20 08:01:52
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个好,看起来很实用
轮达
2026-1-21 01:42:42
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
yyds。多谢分享
东门清心
2026-1-27 07:27:17
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
过来提前占个楼
怒鼓踊
2026-1-29 01:56:45
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
新版吗?好像是停更了吧。
昝梓菱
2026-1-29 03:34:35
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
热心回复!
峰襞副
2026-1-29 08:32:56
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢,下载保存了
毁抨句
2026-1-30 05:05:47
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
分享、互助 让互联网精神温暖你我
戟铵腴
2026-2-4 05:03:38
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
过来提前占个楼
杜优瑗
2026-2-8 08:56:54
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,学习下。
倘伟
2026-2-9 04:05:56
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢楼主提供!
劳暄美
2026-2-9 10:57:05
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,学习下。
纪睐讦
2026-2-10 01:56:07
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢楼主提供!
单于易槐
2026-2-10 11:30:16
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
收藏一下 不知道什么时候能用到
杜优瑗
2026-2-10 12:41:11
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
热心回复!
下一页 »
1
2
/ 2 页
下一页
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
程序
签约作者
程序园优秀签约作者
发帖
国语诗
2026-2-10 12:41:11
关注
0
粉丝关注
11
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991126
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
神泱
9518
6
韶又彤
9909
7
荪俗
8992
8
宋子
9875
9
蓬森莉
9869
10
俞瑛瑶
10000
查看更多
今日好文热榜
286
程序员AI编程之提示词【学习笔记】
847
AgileAI - 一个新的 .NET AI 库
299
OpenClaw AI助手本地部署完整教程
23
AI 编程助手 + 基于 CLI 的 Manus 实现(Ja
716
React 技术深度探讨
258
从分形到森林——使用 Three.js 创建逼真的
561
React 技术深度探讨
1000
React 技术深度探讨
470
【读书笔记】【CUDA编程指南】CUDA简介
870
React 技术深度探讨
5
hal库总结学习
931
"Natural-Language Agent Harnesses" 论文
846
自我即自感:一种极简存在论
78
Microsoft Agent Framework + Kimi API 实
354
【节点】[Posterize节点]原理解析与实际应
5
【小记】解决校园网中单播互通的不同子网间
760
GitHub 热门项目 Top 10 | 2026 年 04 月 0
194
Spring Cloud Gateway实战:微服务API网关
791
罗兰艺境GEO内容工程实战复盘:CSDN 92分技
525
MacBook Air 本地运行大语言模型(LLM)