Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang通道死锁问题,是否应关闭通道 主程序包 进口( “fmt” “同步” ) func main(){ ch1:=制造(成交量,100) ct:=0 var wg sync.WaitGroup 工作组.添加(1) go func(){ //延迟关闭(ch1) 对于i:=0;i_Go_Concurrency_Channel_Goroutine - Fatal编程技术网

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 at
wg.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
        }
    }()