尘封十年的 Go 提案迎来转机?bradfitz 亲自操刀 Demo,让加锁也能 select 了
Go issue #16620 提出于 2016 年,核心诉求是希望能在 `select` 语句中等待一个 `sync.Cond` 被唤醒,从而把条件变量和 channel、`context.Context` 混在一起使用。这个提案十年未决的根本原因,在于条件变量是“边沿触发(edge-triggered)”、而 channel 是“电平触发(level-triggered)”,两者语义难以直接调和。近期,bradfitz 在该 issue 下提交了一份 Demo CL(`go-review.googlesource.com/c/go/+/828544`),为 `sync.Mutex` 引入了实验性的 `LockChan()` 方法,让“抢锁”这个动作也能作为 `select` 的一个 case,从而原生支持“抢锁与超时 / 取消竞争”的写法。本文将梳理这段十年历史、拆解这份 Demo 的设计与语义,并讨论它对 Go 并发编程可能带来的影响与局限。