两个 goroutine,一个输出奇数,一个输出偶数,交替输出,最终达到顺序输出的目的。
其中 B 协程运行到最后的时候,如果不做特殊的处理,继续向 A 通道写入数据,会导致 A 通道死锁。
感到很奇怪,为什么会这样? A 通道这时候是没有数据的,为什么不让写?
package main
import (
"fmt"
)
func main() {
// 创建 3 个 channel,A,B 和 Exit
A := make(chan bool)
B := make(chan bool)
Exit := make(chan bool)
go func() {
// 如果 A 通道是 true,我就执行
for i := 1; i <= 10; i += 2 {
if ok := <-A; ok {
fmt.Println("A 输出", i)
B <- true
}
}
}()
go func() {
defer func() { Exit <- true }() // 这个协程的活干完之后,向主 goroutine 发送信号
// 如果 B 通道是 true,我就执行
for i := 2; i <= 10; i += 2 {
if ok := <-B; ok {
fmt.Println("B 输出", i)
if i != 10 { // 如果 i 等于 10 了,就不要再向 A 通道写数据了,否则将导致 A 通道死锁,至于为什么,坦白说我很疑惑
A <- true
}
}
}
}()
A <- true // 启动条件
<-Exit // 结束条件
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.