1 回答
TA贡献1796条经验 获得超7个赞
您的程序阻塞,因为这是您编写的,请考虑以下操作顺序:
main
goroutine 启动a.f
goroutine。a.f
试图从 nil 通道读取的块a.exit
。main
设置a.exit
为无缓冲通道,a.f
现在阻止从新通道读取,这是允许的。main
将值写入a.exit
并a.f
从中读取值a.exit
,这会同步 goroutines,现在下界被阻塞。a.f
现在阻止尝试写入 unbuffereda.exit
,这将永远不会解除阻止,因为没有人会再次尝试从通道读取。main
现在退出并导致所有其他 goroutine 退出,这可能发生在第 5 步之前。
所以你的程序从不输出的原因+++++over++++++
是:
你的
a.f
goroutine 阻塞,a.exit <- true
因为没有其他 goroutine 会从通道中读取这个值。您的goroutine 可能会在完成工作
main
之前退出并终止整个程序。a.f
我想你是在问如何在 goroutine 完成后让 main 退出,这是最简单的例子:
package main
import (
"fmt"
)
type A struct {
exit chan struct{}
}
func (a *A) f() {
defer close(a.exit) // Close the chanel after f() finishes, closed channels yield the zero-value so <-a.exit will unblock
fmt.Println("+++++over++++++")
}
func main() {
a := A{}
go a.f()
a.exit = make(chan struct{})
<-a.exit
}
- 1 回答
- 0 关注
- 70 浏览
添加回答
举报