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

时间:2015-09-24 08:15:19

标签: go

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或使用去1.4.3或在Windows下运行它,它会表现良好。如果有人能解释一下,这真的很奇怪吗?

1 个答案:

答案 0 :(得分:5)

Dominik Honnef提供了回答issue ##12734 for Go 1.5.1的答案:

  

dominikh :问题在于使用cgo(网络使用,忽略细节)。使用cgo时,Go死锁检测无法正常运行,因为C world可能随时调用Go函数,因此理论上不存在死锁;我们可能只是无限期地等待外部函数调用。