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 關注
- 113 瀏覽
添加回答
舉報