gpt4 book ai didi

go - 为什么 goroutines 用缓冲 channel 解决死锁问题?

转载 作者:行者123 更新时间:2023-12-01 22:21:58 26 4
gpt4 key购买 nike

我有一个缓冲 channel ,我故意限制为 2 个元素。当我将更多元素写入 channel 而不从中读取时,我会按预期出现死锁。但是,如果我使用 goroutine 写入我的 channel ,问题就消失了。为什么?

// Function to process messages in an array. We stop processing once we
// encounter the string 'stop' even if there are other messages
func processCmd(s []string, c chan int) {

msgCount := 0

for index, v := range s {

if index == len(s)-1 && v == "stop" {
// If we've reached the last element and the message is "stop", don't count it
break
} else if v == "stop" {
c <- msgCount // Send msgCount to the channel
continue
} else {
msgCount++
}
}

c <- msgCount // Send msgCount to the channel

close(c)
}

func main() {
s := []string{"message a", "message b", "message c", "stop", "message d", "stop", "message e"}

c := make(chan int, 2)

processCmd(s, c)
//go processCmd(s, c) // doesn't have an issue with buffer length

for v := range c {
fmt.Println(v)
}

}

最佳答案

运行时processCmd内联(如代码所示),没有任何东西可以从 channel 接收。添加两个元素后,processCmd将等到有空间添加更多。正如您所说,这按预期工作。
运行时processCmd在 goroutine 中,main()启动 goroutine 并进入 for v := range c环形。这将消耗来自 c 的元素直到 channel 关闭。尽快v := range c消耗第一个元素,processCmd可以自由地向 channel 添加更多数据,解除阻塞。
这将持续到 processCmd关闭 channel ,此时 for 循环将终止,程序也将终止。
注意:为了可见性,不要忘记添加 go标签。没有多少人看goroutine标签。

关于go - 为什么 goroutines 用缓冲 channel 解决死锁问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62785539/

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