gpt4 book ai didi

go - 为什么我的 channel 会死锁?

转载 作者:IT王子 更新时间:2023-10-29 01:48:47 34 4
gpt4 key购买 nike

我正在尝试编写一个简单的 Go 脚本来计算不超过 8 的自然数的总和:

package main
import "fmt"

func sum(nums []int, c chan int) {
var sum int = 0
for _, v := range nums {
sum += v
}
c <- sum
}

func main() {
allNums := []int{1, 2, 3, 4, 5, 6, 7, 8}
c1 := make(chan int)
c2 := make(chan int)
sum(allNums[:len(allNums)/2], c1)
sum(allNums[len(allNums)/2:], c2)
a := <- c1
b := <- c2
fmt.Printf("%d + %d is %d :D", a, b, a + b)
}

但是,运行该程序会产生以下输出。

throw: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.sum(0x44213af00, 0x800000004, 0x420fbaa0, 0x2f29f, 0x7aaa8, ...)
main.go:9 +0x6e
main.main()
main.go:16 +0xe6

goroutine 2 [syscall]:
created by runtime.main
/usr/local/go/src/pkg/runtime/proc.c:221

exit status 2

为什么我的代码会死锁?我很困惑,因为我使用 2 个单独的 channel 来计算小额金额。这两个 channel 究竟是如何相互依赖的?

最佳答案

你的 channel 没有缓冲,所以 c <- sum在线 sum()将阻塞直到其他例程从另一端读取。

一种选择是向 channel 添加缓冲区,这样您就可以在不阻塞的情况下向 channel 写入值:

c1 := make(chan int, 1)
c2 := make(chan int, 1)

或者,如果您运行 sum()作为一个单独的 goroutine 运行,然后它可以在你的 main() 时阻塞函数继续到它从 channel 读取的点。

关于go - 为什么我的 channel 会死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14050673/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com