将数据发送到通道片中的整数通道会导致死锁
该代码预计将创建 5 个 (+1 ) 个通道。这些通道用于发送整数值,并在中接收相同的值,最后将它们扇入到 。fanInChansend()receive()fanInChan
验证码:-
package main
import (
"fmt"
"sync"
)
func main() {
defer fmt.Println("About to exit!")
fmt.Println("Started")
channels := make([]chan int, 5)
fanInChan := make(chan int)
go send(channels)
go recive(fanInChan, channels)
for val := range fanInChan {
fmt.Println("Fanin", val)
}
}
func send(channels []chan int) {
defer fmt.Println("Send Ended")
fmt.Println("Send Started")
for i := 0; i < 100; i++ {
channels[i%5] <- i
}
for i := 0; i < 5; i++ {
close(channels[i])
}
}
func recive(fanin chan<- int, channels []chan int) {
defer fmt.Println("Recive Ended")
fmt.Println("Recive Started")
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func(inew int) {
defer wg.Done()
fmt.Println(inew)
for v := range channels[inew] {
fanin <- v
}
}(i)
}
wg.Wait()
close(fanin)
}
戈朗游乐场
输出:-
Started
Send Started
Recive Started
4
1
2
3
0
fatal error: all goroutines are asleep - deadlock!
... //You can see rest on playground link above
问题开始于 for 内部的循环send()
for i := 0; i < 100; i++ {
channels[i%5] <- i
}
qq_笑_17
墨色风雨
随时随地看视频慕课网APP
相关分类