【发布时间】:2021-05-21 11:51:08
【问题描述】:
将数据发送到通道切片中的整数通道会导致死锁
该代码预计会创建 5 个 (+1 fanInChan) 频道。这些通道用于通过send() 发送整数值并在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
问题始于send() 内的for 循环
for i := 0; i < 100; i++ {
channels[i%5] <- i
}
【问题讨论】:
-
这些值应该在由 for 循环中的 goroutines 创建的通道中的
receive()中接收 -
在
receive()中,每个goroutine 都在一个单独的通道channel[0] to channel[4]上,该通道应该将整数值发送到fanin。这些值将在频道fanInChan上的main()中接收。 -
哎呀,我的错,我读错了代码。对不起。