[GO channel deadlock]在处理通道数据时遇到死锁问题无法对应到通道是在哪个场景下被阻塞。 代码不难,只为搞懂阻塞。
自己的分析:
- 在第一个协程执行完成后才进行关闭通道的操作所以死锁不是关闭通道导致的。
- 在主线程上有通过forr,对通道内的数据进行消费
- 基于下面通道阻塞的各个场景,我无法判断下面的代码是在哪个场景下被阻塞了?
1. 运行环境
go version go1.19.3 linux/amd64
2. 问题描述?
package main
import (
“fmt”
“sync”
)
var locker sync.Mutex
func test(num int, ch chan int) {
for i := (num - 1) * 30; i < num*30; i++ {
if i%2 == 0 {
locker.Lock()
ch <- i
locker.Unlock()
}
}
}
func main() {
var ch chan int = make(chan int)
for i := 1; i <= 1; i++ {
go test(i, ch)
}
defer close(ch)
for v := range ch {
fmt.Println(v)
}
}
3. 您期望得到的结果?
No deadlock after execute above codes.
4. 您实际得到的结果?
24
26
28
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/nfs/site/disks/simcloud_zhoudo1x_002/goproject/goroutine/main.go:28 +0x11e
exit status 2
推荐文章: