01 / 05准备播放
结果和通知先分开
两个盒子,各有自己的工作
GORESULT / NOTIFY · 先写结果,再关通知准备
RUNNABLE EXAMPLE两个 waiter 等一个完成点
执行第 10–13 行
package main
import (
"fmt"
"sync"
)
func main() {
result := 0
done := make(chan struct{})
var waiters sync.WaitGroup
waiters.Add(2)
for i := 1; i <= 2; i++ {
go func(id int) {
defer waiters.Done()
<-done
fmt.Println("waiter", id, "reads", result)
}(i)
}
result = 42
close(done)
waiters.Wait()
}
这是可运行的完整示例;省略的只是解释,不是代码。
PUBLISH PROTOCOL结果盒和通知 channel
两步发布DATA / 结果盒0结果还没写入
SIGNAL / done channel等待关闭只负责发完成信号
先准备两个独立的等待者。
接收方等待 done
waiter 1准备等待—
waiter 2准备等待—
OBSERVED还没有输出
result 放数据,done 只放完成信号。
执行位置0.0 s0%
旁白
点一下播放即可。也可以只听声音,或拖动进度跳到想看的位置。
0:001:19
正在准备本课音轨与图解。首次播放需要点一下。