【发布时间】:2017-07-09 06:00:43
【问题描述】:
Golang 新手在这里。有人能解释一下为什么下面的代码会产生死锁吗?
我知道将 true 发送到 boolean
package main
import (
"fmt"
"sync"
"time"
)
var wg2 sync.WaitGroup
func producer2(c chan<- int) {
for i := 0; i < 5; i++ {
time.Sleep(time.Second * 10)
fmt.Println("Producer Writing to chan %d", i)
c <- i
}
}
func consumer2(c <-chan int) {
defer wg2.Done()
fmt.Println("Consumer Got value %d", <-c)
}
func main() {
c := make(chan int)
wg2.Add(5)
fmt.Println("Starting .... 1")
go producer2(c)
go consumer2(c)
fmt.Println("Starting .... 2")
wg2.Wait()
}
以下是我的理解,我知道这是错误的:
- 通道将在写入 0 时被阻塞 生产者函数循环
- 所以我希望通道被 之后的消费者。
- 由于通道在步骤 2 中被清空, 生产者函数可以再次输入另一个值然后得到 被阻止并再次重复第 2 步。
【问题讨论】:
-
您向频道发送了五次消息,但只使用了一次频道。 producer2 goroutine 将被阻塞,直到四个消息的其余部分被消费。
-
另外,您对
sync.WaitGroup的使用是错误的,因为它调用了Add(5),但只调用了一次Done()。 -
@ymonad 我补充了我的理解。你能纠正我哪里出错了吗?注册。 Add(5) - 当消费者执行 5 次时,我期望 Done() 被调用 5 次
-
在第 3 步中,您提到第 2 步会再次重复,但事实并非如此,您的代码中的消费者只消费一次。
标签: multithreading go channel