小编Gij*_*ong的帖子

为什么种族探测器没有检测到这种种族状况?

我目前正在学习Go编程语言,现在正在尝试原子包。

在此示例中,我产生了许多Goroutine,它们都需要增加包级变量。有几种避免竞争情况的方法,但是现在我想使用atomic软件包解决此问题。

在Windows PC(go run main.go)上运行以下代码时,结果不是我期望的结果(我希望最终结果是1000)。最终数字在900到1000之间。在Go Playground中运行代码时,该值为1000。

这是我正在使用的代码:https : //play.golang.org/p/8gW-AsKGzwq

var counter int64
var wg sync.WaitGroup

func main() {
    num := 1000
    wg.Add(num )
    for i := 0; i < num ; i++ {
        go func() {
            v := atomic.LoadInt64(&counter)
            v++
            atomic.StoreInt64(&counter, v)

            // atomic.AddInt64(&counter, 1)

            // fmt.Println(v)
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println("final", counter)
}
Run Code Online (Sandbox Code Playgroud)
go run main.go
final 931

go run main.go
final 960

go run main.go
final 918
Run Code Online (Sandbox Code Playgroud)

我本来希望比赛检测器会给出错误,但是不会:

go run …
Run Code Online (Sandbox Code Playgroud)

concurrency multithreading go race-condition goroutine

1
推荐指数
1
解决办法
78
查看次数