我试图在同步管理器(1,2,3,4...)中打印奇数,使用两个goroutine,我很困惑为什么我的代码会导致死锁。请你能帮我理解吗?
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func odd(ch chan bool){
i :=1
for i<=10{
<-ch
fmt.Println(i)
i+=2
ch<-true
}
wg.Done()
}
func even(ch chan bool){
i :=2
for i<=10{
<-ch
fmt.Println(i)
i+=2
ch <- true
}
wg.Done()
}
func main() {
ch :=make(chan bool)
wg.Add(2)
go even(ch)
go odd(ch)
ch <- true
wg.Wait()
}
O/P: 1 2 3 4 5 6 7 8 9 10 致命错误:所有 goroutine 都睡着了 - 死锁!
goroutine 1 [semacquire]: sync.runtime_Semacquire(0x5844a8) /usr/local/go-faketime/src/runtime/sema.go:56 +0x45 sync.(*等待组)。Wait(0x5844a0) /usr/local/go-faketime/src/sync/waitgroup.go:130 +0x65 main.main() /tmp/sandbox505861393/prog.go:37 +0xcf
goroutine 6 [chan send]: main.even(0xc00005e060) /tmp/sandbox505861393/prog.go:26 +0xc5 由 main.main /tmp/sandbox505861393/prog.go:34 +0x7f
当我改变 goroutine 的顺序时,o/p 开始以奇偶的方式打印,我也很难理解这一点。我将不胜感激你的帮助,谢谢。
小唯快跑啊
犯罪嫌疑人X
相关分类