Go Runtime(九):Runtime信号量与同步原语

本文源码基线为 Go 1.26.2、Linux/amd64。sync 的公开语义由标准库保证;本文讨论的状态位、队列和 runtime 接口属于版本相关实现,不应被业务代码依赖。 sync.Mutex 的竞争慢路径、RWMutex 的读写协调和 WaitGroup 的等待,最终都需要把 G 停下来并在条件满足时重新放回调度器。它们共享 runtime semaphore,但并不共享完全相同的高层状态机。 先建立边界:runtime semaphore 是“按地址等待与唤醒”的底层设施,不是公开的计数信号量类型。存放在 uint32 地址中的 token 只服务于防丢唤醒和交接协议。 从sync包到runtime 标准库通过无函数体声明和 go:linkname 连接 runtime: TEXTinternal/sync Mutex slow path -> runtime_SemacquireMutex -> runtime_Semrelease sync RWMutex -> readerSem / writerSem WaitGroup -> sema Cond -> notifyList 公开类型保留自己的原子状态;runtime 只负责等待队列、park/ready 和 contention profile。把所有语义都归因于 semaphore,会看不懂 Mutex 的 starvation、RWMutex 的 writer preference 和 WaitGroup 的 misuse 检测。 ...

August 18, 2026