为了账号安全,请及时绑定邮箱和手机立即绑定

Golang - 为什么会出现这种竞争条件?

Golang - 为什么会出现这种竞争条件?

Go
绝地无双 2021-10-04 16:50:16
package mainimport "fmt"var quit chan intvar glo intfunc test() {    fmt.Println(glo)}func main() {    glo = 0    n := 10000    quit = make(chan int, n)    go test()    for {        quit <- 1        glo++    }}情况:上面的程序输出 10000。但是当我为n分配一个更大的数字(例如n := 1000000)时,输出将是一个小于 n的随机数。我没有调用runtime.GOMAXPROCS(),所以这两个 goroutine 不能并行运行。执行go run -race以检测竞争条件,最终没有任何警告。题:为什么会出现这种竞争条件?
查看完整描述

1 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

由于goroutinesmain和testgoroutines之间没有同步,你不知道fmt.Println调用 intest会在什么时候发生。


运行时GOMAXPROCS = 1,答案主要取决于调度程序何时决定停止执行main并切换到test。循环中的发送操作是调度程序可以切换到另一个 goroutine 的一个点,因此通过足够的循环迭代,您希望test有机会在某个时刻执行。不一定每次运行都在相同的迭代中进行切换,从而导致结果的变化。


至于用比赛检测器捕捉到这个,它成功地为我解决了这个问题:


$ 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

==================

...


查看完整回答
反对 回复 2021-10-04
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信