2013-09-04 2 views
0

저는 golang (whith Java 동시성 배경)을 처음 사용합니다. 코드의 평화를 고려해Go 채널 재사용으로 인해 교착 상태가 발생합니다.

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) 
} 

이 코드를 실행하면, 나는 또 다른 go sendenum(0, c) 문이 문제를 해결 추가

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 

내가 아는이 오류를 얻을 ...하지만

인 경우 교착 상태가 발생 했습니까?

답변

4

가 0을 수신 한 후, main합니다 (y 변수에 넣어) 도착 다른 값 c의 수신단에서 대기를 유지하지만, main를 실행 goroutine 그대로 유일가 남아 있지 않습니다 절대 살고 있다.

다른 go sendenum(0, c)를 추가

, 그것은 실제로 y 변수로두고,받는 두 번째 채널에 값을 가져옵니다, 인쇄 xy 출력 및 프로그램이 성공적으로 완료됩니다.

0

채널을 "재사용"하는 것이 문제입니다. 이것은 코드가 두 개의 읽기를 규정하기 때문에 일어나는 단순한 교착 상태에 불과하지만 같은 채널에 한 번 쓰기 만합니다. 두 번째 읽기는 결코 발생할 수 없으므로 교착 상태가 발생합니다.