#1279·eino

[错误] compose: receiveWithDeadline 从一个 goroutine 中写入命名结果,与截止时间返回同时发生

作者: newnewself创建于 2026年9月12日更新于 2026年9月12日

描述错误

compose.receiveWithDeadline 创建一个 goroutine,将直接分配给包含函数的 命名返回值

go
go func() {
	ta, closed = recv()  // 将调用者可见的结果写入
	resultCh <- struct{}{} // 将结果写入通道
}()

当超时时间在 recv() 返回之前触发时,函数通过超时分支返回(返回 nil、false、true),而被放弃的 goroutine 仍在运行。如果待处理接收操作完成,则 goroutine 会同时写入 ta/closed,并且调用者读取结果也与之无序。没有任何东西同步这两者:在超时分支中,goroutine 的写入和函数的返回没有发生先于关系,因此在每次超时到期时,待处理任务在超时时间之后完成。