为了账号安全,请及时绑定邮箱和手机立即绑定

sync.WaitGroup.Done() 如何实际工作?

sync.WaitGroup.Done() 如何实际工作?

Go
牧羊人nacy 2022-06-13 17:14:40
我为一个创建 4 个 goroutine 的程序运行了以下代码,根据我得到的输出,我的代码似乎运行正常,但它给出了错误:-fatal error: all goroutines are asleep - deadlock!我添加了 4 个 WaitGroups,并且随着每个 goroutine 的完成,我执行了 wg.Done(),但我仍然不明白为什么会发生这样的错误。我的代码:package mainimport (    "fmt"    "sync")var wg sync.WaitGroupfunc sort(x []int) {    fmt.Println("Initial: ", x)    var i int    var j int    for i = 0; i < len(x); i++ {        for j = 0; j < len(x)-i-1; j++ {            if x[j] > x[j+1] {                temp := x[j+1]                x[j+1] = x[j]                x[j] = temp            }        }    }    fmt.Println("Sorted: ", x)    wg.Done()}func main() {    fmt.Println("Enter an array of number preferrably in multiples of 4:- ")    inputSlice := make([]int, 0, 1)    for true {        var n int        fmt.Print("Enter the number: ")        fmt.Scan(&n)        inputSlice = append(inputSlice, n)        fmt.Print("Do you want to continue adding numbers (y/n) ? ")        var char string        fmt.Scan(&char)        if char == "n" || char == "N" {            if len(inputSlice)%4 == 0 {                break            } else {                fmt.Println("Please enter more ", 4-len(inputSlice)%4, " numbers")            }        }        fmt.Println("Test: ", n)        fmt.Println("Input: ", char)    }    fmt.Println("Initial: ", inputSlice)    size := len(inputSlice)    wg.Add(4)    div := (size / 4)    sort1 := inputSlice[:div]    go sort(sort1)    sort2 := inputSlice[div:(div * 2)]    go sort(sort2)    sort3 := inputSlice[(div * 2):(div * 3)]    go sort(sort3)    sort4 := inputSlice[(div * 3):]    go sort(sort4)    wg.Wait()    final := make([]int, 0, 1)    for _, val := range sort1 {        final = append(final, val)    }    for _, val := range sort2 {        final = append(final, val)    }    for _, val := range sort3 {        final = append(final, val)    }    for _, val := range sort4 {        final = append(final, val)    }    sort(final)    fmt.Println("Sorted: ", final)}
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

实际上我没有遇到死锁,而是另一个错误:panic: sync: negative WaitGroup counter.

您将 4 添加到等待组:

wg.Add(4)

然后你wg.Done()sort()4 个启动的 goroutine 中调用。没关系。

但你也有一个“最终”的sort()电话main

sort(final)

而 insidewg.Done()也会被调用:

panic: sync: negative WaitGroup counter

一个“简单”的解决方法是在调用之前将一个添加到等待组sort

wg.Add(1)
sort(final)


查看完整回答
反对 回复 2022-06-13
?
catspeake

TA贡献1111条经验 获得超0个赞

这总共是5 个 sort()调用,意味着5 wg.Done(),但是您只添加了wg.Add(4)。这导致

panic: sync: negative WaitGroup counter


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信