Zig 的 Io.Threaded:用普通线程实现可靠的系统调用取消
来源:matklad.github.io — 2026-08-06
📋 概述
作者称赞 Zig 的 std.Io.Threaded 实现——一个 just use threads 的并发后端,却能实现让阻塞在系统调用里的线程被可靠取消的能力。文章剖析其 POSIX 原理:取消线程通过共享内存置标志并用信号打断目标线程的阻塞调用,线程收到 EINTR 后检查标志决定重试或展开回滚。这一机制让并发真正包含取消这一核心语义。
🔑 核心要点
- 并发不同于并行,并发必然涉及主动取消:当一个计算发现另一个已无必要就应取消它——这意味着没有可靠的取消机制,并发调度只会积压越来越多无意义的任务
- 问题在于线程可能阻塞在内核系统调用中,普通语言 API 无法将其唤醒——这说明仅靠用户态标志位是不够的,必须触及内核层面才能打断真正卡住的调用
- POSIX 的解法是用信号打断阻塞调用使其返回 EINTR,配合共享内存标志实现可靠取消——这样做的好处是无需改造内核,用标准机制就能覆盖各种阻塞场景
- Zig 将取消请求具体化为 error.Canceled,并把它纳入错误管理的一部分——这说明取消被当作一等公民处理,调用方能像处理其他失败一样显式应对,而不会留下静默的僵尸操作
- 与 Java 中断(不能打断 IO 系统调用)、pthread_cancel(整线程拆除)相比,Zig 在接口层区分可能并发与必须并发——这意味着语义更精确,既能按需取消,又避免一刀切地破坏整个线程
💡 金句
并发几乎不发生在 CPU 上,它是一场由内核、运行时与语言共同署名的幻象。
👍 0
👎 0
← 返回 Lobsters 首页