Go println和fmt.println竞争检测器的不同输出
我在race detector中对Go println和fmt.println竞争检测器的不同输出,go,concurrency,goroutine,Go,Concurrency,Goroutine,我在race detector中对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()
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
是内置的,非常特殊?种族检测器是一个动态测试工具,没有静态分析。为了从race detector获得可靠的结果,您应该争取程序的高测试覆盖率,最好使用多个进程编写大量测试(通过设置GOMAXPROCS>1,GOMAXPROCS=numpu是Go 1.5的默认值),并使用定期执行这些测试的连续集成工具
种族检测器不会报告任何误报,因此您应该认真对待每个输出。另一方面,根据goroutines和进程的调度顺序,它可能无法在每次运行时检测到所有比赛
在您的示例中,将所有内容封装在一个紧密的循环中,然后重新执行测试,在这两种情况下都会正确地报告竞争。竞争检测器是一个动态测试工具,没有静态分析。为了从race detector获得可靠的结果,您应该争取程序的高测试覆盖率,最好使用多个进程编写大量测试(通过设置GOMAXPROCS>1,GOMAXPROCS=numpu是Go 1.5的默认值),并使用定期执行这些测试的连续集成工具 种族检测器不会报告任何误报,因此您应该认真对待每个输出。另一方面,根据goroutines和进程的调度顺序,它可能无法在每次运行时检测到所有比赛
在您的示例中,将所有内容封装在一个紧密的循环中,然后重新执行测试,这两种情况下都能正确地报告竞争。这只是偶然的。竞赛检测器没有看到竞赛是f()没有执行。@JimB如果我添加
时间。Sleep
等待,仍然没有竞赛,输出为1,所以f
运行。我看到了。尽管您的测试不正确(并且睡眠不能保证goroutine将运行),但将值复制到接口中似乎有这种奇怪的行为。(顺便说一句,种族检测器只能保证没有误报,所以它偶尔会漏掉一些东西)@JimB关于睡眠的说法是正确的,但这里只要看到结果就足够了。我已经怀疑你关于抄袭的解释,但我想确保并看到一个正确的答案,以便我可以学到一些新的东西。假阳性,是的,最好用种族来检查,但我们不能认为没有种族是理所当然的。这里存档以供参考:这只是偶然的。竞赛检测器没有看到竞赛是f()没有执行。@JimB如果我添加时间。Sleep
等待,仍然没有竞赛,输出为1,所以f
运行。我看到了。尽管您的测试不正确(并且睡眠不能保证goroutine将运行),但将值复制到接口中似乎有这种奇怪的行为。(顺便说一句,种族检测器只能保证没有误报,所以它偶尔会漏掉一些东西)@JimB关于睡眠的说法是正确的,但这里只要看到结果就足够了。我已经怀疑你关于抄袭的解释,但我想确保并看到一个正确的答案,以便我可以学到一些新的东西。假阳性,是的,最好通过种族检查,但我们不能认为不允许种族。此处存档以供参考: