猿问

golang 在死锁检测中有奇怪的行为

package main


import (

    "log"

    "net/http"

)


func useless_func(address string) []byte {

    http.Get("https://www.google.com")

    return nil

}

func test_a(test_channel chan int) {

    test_channel <- 1

    return

}


func test() {

    test_channel := make(chan int)

    for i := 0; i < 10; i++ {

        go test_a(test_channel)

    }

    for {

        log.Println(<-test_channel)

    }

}

func main() {

    test()

}

此代码不会因死锁而中断,我在 Linux 4.1.6-1 和 3.16.0-4 下使用 go 1.5.1 amd64 尝试此代码并得到相同的结果。但是如果我删除 useless_func 或使用 go 1.4.3 或在 windows 下运行它,它会表现良好。这真的很奇怪,如果有人能解释一下吗?


慕的地6264312
浏览 273回答 1
1回答

慕后森

Dominik Honnef针对 Go 1.5.1 的问题 ##12734提供了答案:dominikh:问题真正在于使用 cgo (网络使用,忽略细节)。使用cgo时,Go死锁检测无法正常工作,因为C世界随时可能调用Go函数,所以理论上不存在死锁;我们可能只是无限期地等待外部函数调用。
随时随地看视频慕课网APP

相关分类

Go
我要回答