gpt4 book ai didi

go - 在 for 循环中生成 goroutine 时出现死锁

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

考虑以下 go playground

package main

import "fmt"

func main() {

var chan_array [2]chan int

chan1 := make(chan int)
chan2 := make(chan int)

chan_array[0] = chan1
chan_array[1] = chan2


for i := 0; i < 2; i++ {
go func() {

select {
case x := <- chan_array[i]:
if (x == 0) {
return
}
fmt.Println(x)
}
}()
}

chan1<- 1
chan2<- 2
chan1<- 0
chan2<- 0
}

上面的代码试图创建 2 个正在运行的 goroutine,它们监听 channel 以发出打印或关闭信号。

但是上面的代码遇到了死锁。

我不知道为什么

谁能指出我的错误?

谢谢

最佳答案

存在一些问题:
chan_array[i-1] 运行时 i 的值是多少:

for i := 0; i < 2; i++ {
go func() {
select {
case x := <- chan_array[i-1]:
if x == 0 {
return
}
fmt.Println(x)
}
}()
}

试试这个:

for i := 0; i < 2; i++ {
go func(i int) {
select {
case x := <-chan_array[i]:
if x == 0 {
return
}
fmt.Println(x)
}
}(i)
}

让我们简化您的代码(进行一些更正):

package main

import "fmt"

func main() {
chan1 := make(chan int)
chan2 := make(chan int)

go routine(chan1)
go routine(chan2)

chan1 <- 1
chan2 <- 2
chan1 <- 0
chan2 <- 0
}

func routine(ch chan int) {
select {
case x := <-ch:
if x == 0 {
return
}
fmt.Println(x)
}
}

有了这些:

chan1 <- 1
chan2 <- 2

fatal error :

all goroutines are asleep - deadlock!

你的 goroutines 完成了,没有 goroutines 监听这里的 chan1chan1:

chan1 <- 0
chan2 <- 0

您更正后的工作示例代码是:

package main

import "fmt"

func main() {
chan1 := make(chan int)
chan2 := make(chan int)

go routine(chan1)
go routine(chan2)

chan1 <- 1
chan2 <- 2
chan1 <- 0
chan2 <- 0
}

func routine(ch chan int) {
for {
select {
case x := <-ch:
if x == 0 {
return
}
fmt.Println(x)
}
}
}

输出:

1
2

关于go - 在 for 循环中生成 goroutine 时出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38820997/

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