Go 发送到select内的另一个通道会造成死锁
发送到select内的另一个通道会造成死锁。我想知道为什么会这样。是因为select语句同时持有它正在侦听的所有通道的锁吗 这是我用来测试它的代码片段: 包干管 进口 fmt 时间 func main{ c1:=makechan int c2:=makechan int 围棋{ time.Sleeptime.Second*1 c2使用makechan int创建的通道是无缓冲的。发送和接收阻塞,直到另一侧准备就绪Go 发送到select内的另一个通道会造成死锁,go,deadlock,Go,Deadlock,发送到select内的另一个通道会造成死锁。我想知道为什么会这样。是因为select语句同时持有它正在侦听的所有通道的锁吗 这是我用来测试它的代码片段: 包干管 进口 fmt 时间 func main{ c1:=makechan int c2:=makechan int 围棋{ time.Sleeptime.Second*1 c2使用makechan int创建的通道是无缓冲的。发送和接收阻塞,直到另一侧准备就绪 在您的示例中,您的主goroutine在c1上被阻塞,您必须为c1创建一个缓冲通道
在您的示例中,您的主goroutine在c1上被阻塞,您必须为c1创建一个缓冲通道。因为当您发送到c1时,即
case i := <-c2:
c1 <- i
}
初始化通道时在代码中输入
c1:= make(chan int)
您正在创建一个无缓冲的频道,selectcase中的后续代码将被阻止
c1 <- i
或者您可以创建另一个goroutine来发送值。这样,新的goroutine将被阻止,for循环将能够从c1检索值
for {
select {
case i := <-c1:
fmt.Println(i)
case i := <-c2:
go func() {
c1 <- i
}()
}
}
c1 := make(chan int, 1)
for {
select {
case i := <-c1:
fmt.Println(i)
case i := <-c2:
go func() {
c1 <- i
}()
}
}