首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >println和fmt.Println在竞争检测器中的不同输出

println和fmt.Println在竞争检测器中的不同输出
EN

Stack Overflow用户
提问于 2015-09-17 21:59:30
回答 1查看 139关注 0票数 1

我在竞速检测器中对printlnfmt.Println有不同的输出,我无法解释。我希望两者都是种族,或者至少两者都不是种族。

代码语言:javascript
复制
package main

var a int

func f() {
    a = 1
}

func main() {
    go f()
    println(a)
}

并且,它发现了预期的竞争条件。

代码语言:javascript
复制
0
==================
WARNING: DATA RACE
Write by goroutine 5:
  main.f()
/home/felmas/test.go:6 +0x30

Previous read by main goroutine:
  main.main()
/home/felmas/test.go:11 +0x4d

Goroutine 5 (running) created at:
  main.main()
/home/felmas/test.go:10 +0x38
==================
Found 1 data race(s)

然而,这一次运行时没有检测到任何竞争。

代码语言:javascript
复制
package main

import "fmt"

var a int

func f() {
    a = 1
}

func main() {
    go f()
    fmt.Println(a)
}

据我所知,没有检测到竞争并不意味着没有竞争,所以这是这些缺陷之一,还是有更深层次的解释,因为println是内置的,相当特殊?

EN

回答 1

Stack Overflow用户

发布于 2015-09-22 03:51:13

竞态检测器是一个动态测试工具,没有静态分析。为了从竞争检测器获得可靠的结果,您应该争取程序的高测试覆盖率,最好是使用多个进程编写大量benchmarks (通过设置GOMAXPROCS > 1,GOMAXPROCS=NumCPU是Go 1.5的默认值),并使用连续集成工具定期执行这些测试。

竞态检测器不会报告任何误报,因此您应该认真对待每个输出。另一方面,它可能不会在每次运行时都检测到每个竞态,这取决于goroutines和进程被调度的顺序。

在您的示例中,将所有内容包装在一个紧密的循环中,并重新执行测试,在这两种情况下都会正确地报告比赛。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32632243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档