Concurrency Golang-为什么会出现这种竞赛条件?; 主程序包 输入“fmt” var quit chan int 变量glo int func测试(){ fmt.Println(glo) } func main(){ glo=0 n:=10000 退出=制造(chan int,n) 进行测试 为了{ 退出
因为Concurrency Golang-为什么会出现这种竞赛条件?; 主程序包 输入“fmt” var quit chan int 变量glo int func测试(){ fmt.Println(glo) } func main(){ glo=0 n:=10000 退出=制造(chan int,n) 进行测试 为了{ 退出,concurrency,go,race-condition,goroutine,Concurrency,Go,Race Condition,Goroutine,因为main和testgoroutines之间没有同步,您不知道fmt.Println调用test将在什么时候发生 当使用GOMAXPROCS=1运行时,答案基本上取决于调度器何时决定停止执行main并切换到test。循环中的发送操作是调度器可以切换到另一个goroutine的一个点,因此有足够多的循环迭代,您会期望test获得在某个点执行的机会。它不一定会在每次运行的同一个迭代中切换,从而导致结果的变化 至于用种族检测器捕捉到这一点,它成功地为我捕捉到了问题: package main imp
main
和test
goroutines之间没有同步,您不知道fmt.Println
调用test
将在什么时候发生
当使用GOMAXPROCS=1
运行时,答案基本上取决于调度器何时决定停止执行main
并切换到test
。循环中的发送操作是调度器可以切换到另一个goroutine的一个点,因此有足够多的循环迭代,您会期望test
获得在某个点执行的机会。它不一定会在每次运行的同一个迭代中切换,从而导致结果的变化
至于用种族检测器捕捉到这一点,它成功地为我捕捉到了问题:
package main
import "fmt"
var quit chan int
var glo int
func test() {
fmt.Println(glo)
}
func main() {
glo = 0
n := 10000
quit = make(chan int, n)
go test()
for {
quit <- 1
glo++
}
}
为什么你认为这段代码没有竞态条件?goroutine与for循环同时运行,没有执行同步。谢谢!但是我的竞态检测器真的不能发现问题,我不知道为什么。我的go版本是1.4.2。我测试的系统安装了go 1.3.3(amd64上的Ubuntu 15.04)。我自己还没有在1.4.2上测试过。似乎当出现死锁时,竞赛检测器无法捕捉到问题。我设法防止了死锁,竞赛检测器成功地捕捉到了问题。你肯定遇到了死锁,你的
main
goroutine填满了一个没有被耗尽的通道。我从输出中省略了这一点ut在我的回答中,因为这不是来自种族检测器,我假设您已经看到了这一点。不会发出误报,但可能有误报(即,没有任何-种族报告的跑步并不意味着没有种族)。
$ go run -race test.go
==================
WARNING: DATA RACE
Read by goroutine 5:
main.test()
/../test.go:8 +0x6e
Previous write by main goroutine:
main.main()
/.../test.go:18 +0xfe
Goroutine 5 (running) created at:
main.main()
/.../test.go:15 +0x8f
==================
...