我在竞速检测器中对println和fmt.Println有不同的输出,我无法解释。我希望两者都是种族,或者至少两者都不是种族。
package main
var a int
func f() {
a = 1
}
func main() {
go f()
println(a)
}并且,它发现了预期的竞争条件。
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)然而,这一次运行时没有检测到任何竞争。
package main
import "fmt"
var a int
func f() {
a = 1
}
func main() {
go f()
fmt.Println(a)
}据我所知,没有检测到竞争并不意味着没有竞争,所以这是这些缺陷之一,还是有更深层次的解释,因为println是内置的,相当特殊?
发布于 2015-09-22 03:51:13
竞态检测器是一个动态测试工具,没有静态分析。为了从竞争检测器获得可靠的结果,您应该争取程序的高测试覆盖率,最好是使用多个进程编写大量benchmarks (通过设置GOMAXPROCS > 1,GOMAXPROCS=NumCPU是Go 1.5的默认值),并使用连续集成工具定期执行这些测试。
竞态检测器不会报告任何误报,因此您应该认真对待每个输出。另一方面,它可能不会在每次运行时都检测到每个竞态,这取决于goroutines和进程被调度的顺序。
在您的示例中,将所有内容包装在一个紧密的循环中,并重新执行测试,在这两种情况下都会正确地报告比赛。
https://stackoverflow.com/questions/32632243
复制相似问题