gpt4 book ai didi

goroutine channel & WaitGroup fatal error : all goroutines are asleep - deadlock

转载 作者:行者123 更新时间:2023-12-01 22:17:28 25 4
gpt4 key购买 nike

有人可以解释为什么我在将回复推送到没有指示缓冲区大小的 channel 时遇到死锁吗?

当我以这种方式创建确认 channel 时,我的测试陷入僵局;
这个死锁: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)
}

最佳答案

您会遇到死锁,因为在无缓冲确认 channel 的情况下没有阅读器,因此发送操作会阻塞。同时,您正在等待 goroutine 在 main 中返回(wg.Wait() 语句)。所以 main 和 goroutine 都被阻塞了。

使用缓冲的 chan 允许 goroutine 完成发送操作并退出,因此 wg.Wait()声明成功,之后 main 继续。

解决无缓冲 chan 情况的一种方法是更改​​等待 goroutine 完成的位置,即

reply := <-request.Confirm
fmt.Println(reply.Value)
wg.Wait()

在阻止 main 之前从 chan 读取时不会死锁,从而允许 goroutine 退出。

关于goroutine channel & WaitGroup fatal error : all goroutines are asleep - deadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58681285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com