[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
一个channel不能解决的问题那就用两个~~
简化下楼主代码:
执行:
重点关注这句 fatal error: all goroutines are asleep - deadlock!
test
函数所在goroutines 已经执行完退出,只剩下main goroutines ,而这个唯一的goroutines 又阻塞了,这不就死锁了。代码再简化下直接把test部分删去,也是一样的效果。