Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go println和fmt.println竞争检测器的不同输出_Go_Concurrency_Goroutine - Fatal编程技术网

Go println和fmt.println竞争检测器的不同输出

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()

我在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()
/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关于睡眠的说法是正确的,但这里只要看到结果就足够了。我已经怀疑你关于抄袭的解释,但我想确保并看到一个正确的答案,以便我可以学到一些新的东西。假阳性,是的,最好通过种族检查,但我们不能认为不允许种族。此处存档以供参考: