0

私はgolang(同時Java実行の背景がある)のが初めてです。このコードの平和を考慮してください:

package main

import "fmt"

func sendenum(num int, c chan int) {
    c <- num
}

func main() {
    c := make(chan int)
    go sendenum(0, c)
    x, y := <-c, <-c
    fmt.Println(x, y)
}

このコードを実行すると、このエラーが発生します

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.main()
    /home/tarrsalah/src/go/src/github.com/tarrsalah/stackoverflow/chan_dead_lock.go:12 +0x90
exit status 2

go sendenum(0, c)別のステートメントを追加すると問題が解決することはわかっています...しかし

デッドロックはいつどこで発生しましたか?

4

2 に答える 2

4

0 を受け取った後main、 の受信側でc別の値が到着する (y変数に入れる) のを待ち続けますが、実行中のゴルーチンmainだけが生き残っているため、決して到着しません。

別の を追加するgo sendenum(0, c)と、実際には 2 番目のチャネル受信で値を取得し、それをy変数に入れ、出力xして出力yし、プログラムは正常に終了します。

于 2013-09-04T18:40:04.140 に答える