gpt4 book ai didi

Go range over channel 死锁问题,我应该关闭 channel 吗?

转载 作者:行者123 更新时间:2023-12-05 08:47:31 26 4
gpt4 key购买 nike

package main

import (
"fmt"
"sync"
)

func main(){
ch1 := make(chan int,100)
ct := 0
var wg sync.WaitGroup

wg.Add(1)
go func(){
//defer close(ch1)
for i:= 0; i < 10;i ++{
ch1 <- i
}
}()

go func(){
defer wg.Done()
for x := range ch1{
fmt.Println(x)
}
}()
wg.Wait()

fmt.Println("numbers:",ct)
}

为什么这段代码会返回 fatal error :所有 goroutines 都睡着了 - 死锁!我发现如果关闭 channel 就不会死锁,但我不知道为什么会这样。将所有项目输入 channel 后是否必须关闭 channel ?

最佳答案

for range只有当/当 channel 关闭时, channel 上的操作才会终止。如果您不关闭 channel 并且不在其上发送更多值,for range语句将永远阻塞,main 也是如此。 goroutine 在 wg.Wait() .

“发送方”一方在发送完所有值后应关闭 channel ,向“接收方”方发出信号,表明 channel 中不会再有任何值。

是的,你应该关闭 channel :

go func() {
defer close(ch1)
for i := 0; i < 10; i++ {
ch1 <- i
}
}()

关于Go range over channel 死锁问题,我应该关闭 channel 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67422322/

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