gpt4 book ai didi

go - fatal error : all goroutines are asleep - deadlock (again)

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

我的 dicerolling 程序发生了一次奇怪的崩溃。它工作正常,但最后它总是说:

fatal error :所有 goroutine 都处于休眠状态 - 死锁!

goroutine 1 [chan 接收]: main.main()/tärning.go:43 +0x746

goroutine 6 [chan receive]: main.dice(0xc00003a0c0, 0xc00003a120, 0xc0000100a0)/tärning.go:51 +0x106 created by main.main/tärning.go:40 +0x59a

goroutine 7 [chan receive]: main.dice(0xc00003a0c0, 0xc00003a120, 0xc0000100a0)/tärning.go:51 +0x106 created by main.main/tärning.go:41 +0x5d3 exit status 2

package main

import (
"fmt"
"sync"
"math/rand"
)

type tärning struct {
rubrik string
minTal, maxTal int
}

type tärningsSvar struct {
rubrik string
svaret int
}

func main() {
var wg sync.WaitGroup
fmt.Println("Dags att kasta tärningar")
var antal int
fmt.Println("Hur många tärningar vill du använda?")
fmt.Scan(&antal)
job := make(chan tärning, antal)
svar := make(chan tärningsSvar, antal)
for i := 0; i < antal; i++ {
fmt.Println("Vad ska tärning", i+1, "ha för rubrik?")
var text string
fmt.Scan(&text)
fmt.Println("Vad ska vara minsta värdet på tärningen?")
var minsta int
fmt.Scan(&minsta)
fmt.Println("Vad ska vara största värdet på tärningen?")
var största int
fmt.Scan(&största)
job <- tärning{rubrik: text, minTal: minsta, maxTal: största}
}
go dice(job, svar, &wg)
go dice(job, svar, &wg)
wg.Wait()
for svaren := range svar {
fmt.Println("Tärning " + svaren.rubrik + " fick: ", svaren.svaret)
}
}

func dice(job chan tärning, svar chan tärningsSvar, wg *sync.WaitGroup) {
wg.Add(1)
for item := range job {
text := item.rubrik
min := item.minTal
max := item.maxTal
slump := (rand.Intn(max - min) + min)
svar <- tärningsSvar{rubrik: text, svaret: slump}
}
wg.Done()
}

最佳答案

我在这里修复了您的代码:https://play.golang.org/p/ZgRRb-wOdDk与评论。请检查。

您的代码中有多个问题。
1.你使用的方式wg.Add(1)在您的代码中,它将不起作用。你必须把 wg.Add(2)在开始你的 go 例程之前删除 wg.Add(1)从骰子功能,因为可能有比赛情况和你的wg.Add(1)可以在 wg.Wait() 时运行已经跑了。

  • 您正在从事 channel 工作。您没有关闭任何 channel 。此外,范围查询是一个阻塞调用。同时,您的svaren := range svar也将被阻止,因为没有人会向其中添加项目。因此,程序将卡在 main 函数被阻止从 svar 读取数据的情况下。 channel 。还有,dice由于job 中没有数据,函数被卡住 channel ,它在 item := range job 中被阻止步。
  • 因此,如果两个 goroutine 相互等待,则会导致死锁情况。
  • 关于go - fatal error : all goroutines are asleep - deadlock (again),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61748607/

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