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

sync.WaitGroup 没有按照我的预期运行,我在这里错过了什么?

sync.WaitGroup 没有按照我的预期运行,我在这里错过了什么?

Go
慕姐8265434 2021-11-08 18:53:02
鉴于以下情况:package mainimport (    "fmt"    "sync")func main() {    n := 100    var wg sync.WaitGroup    wg.Add(n)    x := 0    for i := 0; i < n; i++ {        go func() {            defer wg.Done()            x++        }()    }    wg.Wait()    fmt.Println(n, x)}我希望在最后打印时x总是到达100,但有时打印低至95. 我在这里缺少什么?
查看完整描述

2 回答

?
catspeake

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

有一场比赛x。一种解决方法是x使用互斥锁进行保护:


var mu sync.Mutex

var wg sync.WaitGroup

wg.Add(n)


x := 0

for i := 0; i < n; i++ {

    go func() {

        defer wg.Done()

        mu.Lock()

        x++

        mu.Unlock()

    }()

}


wg.Wait()

fmt.Println(n, x)


我建议在 Go 程序中有多个 goroutine 时发现一些令人费解的事情时运行竞态检测器。


查看完整回答
反对 回复 2021-11-08
?
FFIVE

TA贡献1797条经验 获得超6个赞

使用 sync.atomic 方法以原子方式访问 x。


package main


import (

    "fmt"

    "sync"

    "sync/atomic"

)


func main() {

    n := 100


    var wg sync.WaitGroup

    wg.Add(n)


    var x int32

    for i := 0; i < n; i++ {

        go func() {

            defer wg.Done()

            atomic.AddInt32(&x, 1)

        }()

    }


    wg.Wait()

    fmt.Println(n, x)

}


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

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