给定下面的代码,我试图理解为什么Go竞赛检测器(go run -race example.go
)不会抱怨竞赛条件。
var count int
func main() {
http.HandleFunc("/a/", func(w http.ResponseWriter, r *http.Request) {
count++
fmt.Println(count)
})
http.HandleFunc("/b/", func(w http.ResponseWriter, r *http.Request) {
count++
fmt.Println(count)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
据我了解,Go HTTP Server在单独的goroutine中响应所有请求。考虑到这一点,处理程序函数对全局计数变量的增量是否会在与主goroutine分开的goroutine中发生,从而构成数据竞争?
如果这不是一场数据竞赛,我非常想知道为什么。
这是一次数据竞赛,但是竞赛检测器不会报告未发生的竞赛。您需要确保测试中存在并发调用,并且GOMAXPROCS>1
还可以帮助将其清除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句