【发布时间】:2018-07-28 04:41:31
【问题描述】:
有两种写repro的方法:
第一种方式,程序干净退出。
func recurse(depth int, wg *sync.WaitGroup) {
defer wg.Done()
if depth == 0 {
return
}
wg.Add(1)
go recurse(depth - 1, wg)
}
func main() {
wg := sync.WaitGroup{}
wg.Add(1)
go recurse(3, &wg)
wg.Wait()
}
第二种方式,程序给出“致命错误:所有goroutines都处于睡眠状态-死锁!”
func recurse(depth int, wg sync.WaitGroup) {
defer wg.Done()
if depth == 0 {
return
}
wg.Add(1)
go recurse(depth - 1, wg)
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go recurse(3, wg)
wg.Wait()
}
谁能解释一下第二种方式与第一种方式不同的复杂方式,从而导致“死锁”?
【问题讨论】:
-
请注意,这个编程错误会被 vet 工具捕获。
标签: go concurrency pass-by-reference pass-by-value