当前位置 : 主页 > 网页制作 > HTTP/TCP >

Go HTTP Handler中的简单竞争条件 – 这真的是竞争条件吗?

来源:互联网 收集:自由互联 发布时间:2021-06-16
鉴于下面的代码,我试图理解为什么Go竞赛检测器(go run -race example.go)不会抱怨竞争条件. var count intfunc main() { http.HandleFunc("/a/", func(w http.ResponseWriter, r *http.Request) { count++ fmt.Println(count) })
鉴于下面的代码,我试图理解为什么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也可以帮助清除它们.
网友评论