我想編寫一個簡單的腳本去計算自然數之和高達8:爲什麼我的頻道死鎖?
package main
import "fmt"
func sum(nums []int, c chan int) {
var sum int = 0
for _, v := range nums {
sum += v
}
c <- sum
}
func main() {
allNums := []int{1, 2, 3, 4, 5, 6, 7, 8}
c1 := make(chan int)
c2 := make(chan int)
sum(allNums[:len(allNums)/2], c1)
sum(allNums[len(allNums)/2:], c2)
a := <- c1
b := <- c2
fmt.Printf("%d + %d is %d :D", a, b, a + b)
}
然而,運行此程序產生下面的輸出。
throw: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.sum(0x44213af00, 0x800000004, 0x420fbaa0, 0x2f29f, 0x7aaa8, ...)
main.go:9 +0x6e
main.main()
main.go:16 +0xe6
goroutine 2 [syscall]:
created by runtime.main
/usr/local/go/src/pkg/runtime/proc.c:221
exit status 2
爲什麼我的代碼會死鎖?我很困惑,因爲我使用2個獨立的通道來計算子和。這兩個通道如何依賴?
想想當你通過頻道發送某些內容時,你要向誰發送內容。請記住,您的頻道是無緩衝的,所以通過頻道發送會阻止,直到有人從該頻道讀取。 – nos
http://play.golang.org/p/xyW_KfsFv7或http://play.golang.org/p/Ni-vmvKg2K – rputikar
謝謝!因此,如果沒有'go'語句,我將數據從一個線程發送到它自己。線程在從通話返回之前等待自己接收以便將數據發送到通道中? – dangerChihuahua007