登录
首页 >  Golang >  Go问答

参与整数数据竞争

来源:stackoverflow

时间:2024-03-23 19:00:31 401浏览 收藏

本文探讨了 Go 语言中 int 类型数据竞争的问题。当一个程序中的多个 goroutine 同时访问一个 int 变量时,会发生数据竞争,即使该变量在 64 位机器上原子地读写。编译器和硬件不再像过去那样简单,因此数据竞争仍然是一个重大错误,需要使用诸如 sync/atomic 之类的同步机制来解决。

问题内容

关于 int 类型上 go 数据竞争的问题。 当我通过 go run -race main.go 运行下面的程序时,

package main

import "fmt"

var i int

func main() {

    go func() {
        i = 10
    }()

    i = 5

    fmt.println(i)
}

它显示数据竞争警告。

~  $ go run -race main.go
5
==================
WARNING: DATA RACE
Write at 0x000000605908 by goroutine 7:
  main.main.func1()
      /home/dty1er/main.go:80 +0x3a

Previous write at 0x000000605908 by main goroutine:
  main.main()
      /home/dty1er/main.go:83 +0x56

Goroutine 7 (running) created at:
  main.main()
      /home/dty1er/main.go:79 +0x46
==================
Found 1 data race(s)
exit status 66

我知道为什么会发生这种数据竞争; var i 由 2 个 goroutine 同时访问,无需任何同步。 我不明白的是这段代码的实际问题。根据我的理解,因为 iint,(而我的电脑是 64 位),所以 i 实际上是 64 位。在 64 位机器上,i 可以原子地读/写。所以我认为不存在实际问题。

例如,如果类型是map或slice,由于cpu对内存的访问不能是原子的,所以有时其中间状态是可见的,这是有问题的。

但是当我只使用 int 类型值时,即使存在数据竞争,看起来也没有实际问题。

我的理解正确吗?


正确答案


不,不是。具有数据竞争的程序是未定义的,并且使用 int 并不会神奇地使这种数据竞争消失。编译器和硬件不再像 80 年代那样简单。数据竞争是一个主要错误。

您可以使用sync/atomic以无竞争的方式处理整数,但在此设置中简单的 int 是完全错误的。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《参与整数数据竞争》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>