【发布时间】:2019-11-03 23:13:07
【问题描述】:
有人可以解释为什么我在将回复推送到没有指示缓冲区大小的通道时遇到死锁吗?
当我以这种方式创建确认通道时,我的测试陷入僵局;
这一个死锁:deadlock
request := RequestMessage{
Value: "make it rain",
Confirm: make(chan *ReplyMessage),
}
但不是在我这样创建的时候;
这个不死锁:no deadlock
request := RequestMessage{
Value: "make it rain",
Confirm: make(chan *ReplyMessage,1),
}
package main
import (
"fmt"
"sync"
)
type ReplyMessage struct {
Value string
}
type RequestMessage struct {
Value string
Confirm chan *ReplyMessage
}
var requestChannel chan *RequestMessage
func main() {
requestChannel = make(chan *RequestMessage, 10) // 8 is channel buffer size
request := RequestMessage{
Value: "make it rain",
Confirm: make(chan *ReplyMessage),
}
requestChannel <- &request
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done() // invoke Done on the WaitGroup when finished
request := <-requestChannel
fmt.Printf("Got Request: %s\n", request.Value)
reply := ReplyMessage{Value: "hi"}
request.Confirm <- &reply
}()
wg.Wait()
reply := <-request.Confirm
fmt.Println(reply.Value)
}
【问题讨论】: