gpt4 book ai didi

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

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

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++
}
}

情况:

上面的程序输出 10000。但是当我给 n 分配一个更大的数字时(例如 n := 1000000),输出将是一个随机数 小于 n

我还没有调用 runtime.GOMAXPROCS(),所以这两个 goroutine 不能并行运行。执行 go run -race 来检测竞争条件,最终没有任何警告。

问题:

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

最佳答案

由于 maintest goroutines 之间没有同步,你不知道 fmt.Println 在什么时候调用test 将会发生。

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

关于concurrency - Golang - 为什么会出现这种竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30136884/

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