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
==================
...