채널에 대한 쓰기 작업이 발생하지 않는 이상한 상황에 처해 있습니다. 채널 K 블록에 쓸 수 있지만 로그 문 fmt.Println("k ready")
인쇄되지 않습니다 이유영원히 차단 된 채널에 쓰기
start
routine 1
routine 2
before
routine 3
x= 0
after
before
가 궁금 : 여기
package main
import (
"fmt"
"time"
)
func main() {
c := make(chan int)
s := make(chan bool)
k := make(chan bool)
fmt.Println("start")
go func() {
fmt.Println("routine 1")
s <- true
}()
go func() {
fmt.Println("routine 2")
for {
select {
case <-s :
for i := 0; i < 3; i++ {
fmt.Println("before")
c <- i
fmt.Println("after")
}
case <- k :
fmt.Println("k ready")
break
}
}
}()
go func() {
fmt.Println("routine 3")
for {
select {
case x := <- c :
fmt.Println("x=", x)
k <- true
fmt.Println("k done")
}
}
}()
time.Sleep(1000 * time.Millisecond)
}
그리고
이 출력됩니다. 여기 내가 무슨 생각입니다 :- 일상적인 이동 1가 사실 기록 채널의
- 2가 0 채널 c와 대기 버퍼 크기가 0이기 때문에, 그것은 할 수 없습니다를 기록 일상적인 이동 누군가가 채널 c를 읽지 않는 한 '1'을 쓰십시오.
- 루틴 3이 화면에 나타나면 채널 c를 읽습니다 (이제 루틴 2가 다시 실행됩니다). 가 루틴 2 이력서로 다시 쓸 수 있습니다.) x의 값을 인쇄합니다. 지금은 채널 K에게 쓸 수 있어야하지만 다음의 경우 2 실행해야 goroutine 및 인쇄의 "준비 K"채널 K에 쓸 수 있어야 날에 따르면
을 발생하지 않습니다
채널에 글을 왜 차단했는지 설명 할 수 있습니까? 수정 사항으로 채널 C의 버퍼 크기를 늘릴 수 있음을 알고 모든 것을 인쇄 할 수 있지만이 문제를 해결하는 데 관심이 없습니다. 대신이 시나리오를 이해하고 싶습니다.
좋은 blog 위의 경우를 이해합니다.
링크는 [여기]입니다 (https://play.golang.org/p/3YL2eoTVn1) –