【问题标题】:Trying to reproduce data race in Golang 1.8.3尝试在 Golang 1.8.3 中重现数据竞争
【发布时间】:2017-06-24 23:58:45
【问题描述】:

我尝试在我的应用程序中重现竞态条件,但 go build -race 没有显示任何错误,即使在装有 Linux 的虚拟机上也是如此。

机器:
Windows:4 核
Linux:2 核(Ubuntu Xenial x64 通过 Vagrant 和 VirtualBox)

去版本:
Linux:go version go1.8.3 linux/amd64
窗口:go version go1.8.3 windows/amd64

进入环境:
Linux:https://pastebin.com/pXURKfj3
窗口:https://pastebin.com/MTdjNnVW

示例 1:https://play.golang.org/p/x-eD6bBrzz
示例 2:https://play.golang.org/p/FSg8P7UP8p

我的示例是否存在数据竞争?两者都不是根据go build -race构建的

如果上面的示例没有数据竞争条件,有人可以给我发送示例,我可以在 Golang 中看到真实的数据竞争,以便我可以测试 -race 标志吗?我还在网上找到了一些示例,其中一些没有编译,其中一些相同表明没有数据竞争。

谢谢!

【问题讨论】:

    标签: go


    【解决方案1】:

    您的两个示例都存在数据竞争问题。您可以通过以下方式找出数据竞争。

    1. go run -race program.go
    2. go test -race <package-name> 或 go test -race -run=<testcase-func-name>
    3. go build -race program.go然后执行程序
    4. go install -race <package-name>然后执行程序

    示例 1: 数据竞赛信息

    $ go build -race datarace-try1.go
    $ ./datarace-try1
    8
    ==================
    WARNING: DATA RACE
    Read at 0x00c4200761a8 by goroutine 7:
      main.main.func1()
          /Users/jeeva/go_playground/datarace-try1.go:23 +0x74
    
    Previous write at 0x00c4200761a8 by goroutine 6:
      main.main.func1()
          /Users/jeeva/go_playground/datarace-try1.go:23 +0x8d
    
    Goroutine 7 (running) created at:
      main.main()
          /Users/jeeva/go_playground/datarace-try1.go:25 +0xee
    
    Goroutine 6 (running) created at:
      main.main()
          /Users/jeeva/go_playground/datarace-try1.go:25 +0xee
    ==================
    187410
    Found 1 data race(s)
    

    示例 2: 数据竞赛信息

    $ go build -race datarace-try2.go
    $ ./datarace-try2
    ==================
    WARNING: DATA RACE
    Read at 0x00c420078178 by main goroutine:
      main.main()
          /Users/jeeva/go_playground/datarace-try2.go:10 +0x12e
    
    Previous write at 0x00c420078178 by goroutine 6:
      main.main.func1()
          /Users/jeeva/go_playground/datarace-try2.go:15 +0xd4
    
    Goroutine 6 (finished) created at:
      main.main()
          /Users/jeeva/go_playground/datarace-try2.go:17 +0xf1
    ==================
    ==================
    WARNING: DATA RACE
    Read at 0x00c420078178 by goroutine 7:
      main.main.func2()
          /Users/jeeva/go_playground/datarace-try2.go:20 +0x3f
    
    Previous write at 0x00c420078178 by goroutine 6:
      main.main.func1()
          /Users/jeeva/go_playground/datarace-try2.go:15 +0xd4
    
    Goroutine 7 (running) created at:
      main.main()
          /Users/jeeva/go_playground/datarace-try2.go:23 +0x11d
    
    Goroutine 6 (finished) created at:
      main.main()
          /Users/jeeva/go_playground/datarace-try2.go:17 +0xf1
    ==================
    finish
    Found 2 data race(s)
    exit status 66
    

    【讨论】:

    • 谢谢。我认为在使用 -race 标志构建此应用程序后无需运行应用程序。那是个问题。那么,如果运行测试go test -race packagename 并且没有数据竞争的功能的测试功能,就不会检测到数据竞争?
    • 正确,如果没有测试功能,在测试运行期间不会检测到数据竞争。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多