gpt4 book ai didi

go - println 和 fmt.Println 的竞争检测器输出不同

转载 作者:IT王子 更新时间:2023-10-29 02:23:46 26 4
gpt4 key购买 nike

我无法解释竞争检测器中 printlnfmt.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 是一个动态测试工具,没有静态分析。为了从竞争检测器获得可靠的结果,您应该争取程序的高测试覆盖率,最好通过编写大量 benchmarks 来实现。使用多个进程(通过设置 GOMAXPROCS > 1,GOMAXPROCS=NumCPU 是 Go 1.5 的默认设置)并使用持续集成工具定期执行这些测试。

竞争检测器不会报告任何误报,因此您应该认真对待每一个输​​出。另一方面,它可能无法在每次运行时检测到每场比赛,具体取决于 goroutine 和进程的调度顺序。

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

关于go - println 和 fmt.Println 的竞争检测器输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32632243/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com