golang通道死锁问题,是否应关闭通道 主程序包 进口( “fmt” “同步” ) func main(){ ch1:=制造(成交量,100) ct:=0 var wg sync.WaitGroup 工作组.添加(1) go func(){ //延迟关闭(ch1) 对于i:=0;i
golang通道死锁问题,是否应关闭通道 主程序包 进口( “fmt” “同步” ) func main(){ ch1:=制造(成交量,100) ct:=0 var wg sync.WaitGroup 工作组.添加(1) go func(){ //延迟关闭(ch1) 对于i:=0;i,go,concurrency,channel,goroutine,Go,Concurrency,Channel,Goroutine,for range仅在通道关闭时终止。如果不关闭通道且不在其上发送更多值,则for range语句将永久阻塞,而主goroutine atwg.Wait()语句也将永久阻塞 “发送方”应在发送所有值后关闭通道,并向“接收方”发出信号,表示通道上不会出现更多值 因此,是的,您应该关闭该频道: package main import ( "fmt" "sync" ) func main(){ ch1 := make(chan int
for range
仅在通道关闭时终止。如果不关闭通道且不在其上发送更多值,则for range
语句将永久阻塞,而主goroutine atwg.Wait()
语句也将永久阻塞
“发送方”应在发送所有值后关闭通道,并向“接收方”发出信号,表示通道上不会出现更多值
因此,是的,您应该关闭该频道:
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)
}
go func(){
延迟关闭(ch1)
对于i:=0;i<10;i++{
ch1除非关闭通道,否则从通道读取的for循环将继续读取。这就是死锁的原因,因为从通道读取的goroutine是唯一活动的goroutine,并且没有其他goroutine可以写入它。关闭时,for循环终止
范围未关闭ch1将导致阻塞
即使关闭ch1,您仍然可以从ch1接收数据
可以说,close(ch1)将向ch1发送一条特殊消息,该消息可用于通知ch1接收器将不再接收数据。因此,即使ch1中有数据,您也可以关闭()而不会导致接收器接收剩余数据
频道不需要通过close释放资源,只要没有goroutine持有频道,相关资源就会自动释放。
取消注释延迟关闭(ch1)将解决此问题。
请参阅:对于通道,生成的迭代值是在通道关闭之前在通道上发送的连续值
go func() {
defer close(ch1)
for i := 0; i < 10; i++ {
ch1 <- i
}
}()