2015-03-30 2 views
2

Эта часть кода работает правильно, и мой вопрос - почему. Ive узнал, что вы можете отправлять только одно значение в небуферизованный канал до его блокировки. Но в моем коде я пишу ему два раза, но из разных ходовых процедур, и он работает. Был бы признателен, если бы кто-нибудь мог объяснить мне, почему!Запись на тот же канал с несколькими goroutines

func main(){ 
    var ch chan string =make(chan string) 
    go write(ch) 
    go write2(ch) 
    go read(ch) 
     select{} 
} 

func write(ch chan string){ 
    for{ 
     ch<-"write1" 
    } 
} 

func write2(ch chan string){ 
    for{ 
     ch<-"write2" 
    } 
} 

func read(ch chan string){ 
    for{  
     time.Sleep(time.Second) 
     select{ 
      case res:= <-ch: fmt.Println(res) 
      case <-time.After(time.Millisecond*200): fmt.Println("time out") 
     } 
    } 
} 

ответ

4

Вы можете написать ему снова, потому что вы читаете его. После операции чтения может произойти другая запись. На самом деле не имеет значения, из чего goroutine выполняет операцию записи или чтения.

Страница Go Memory Management объясняет это.

+1

спасибо. Поэтому, когда «write» записано в ch, «write2» будет ждать/блокировать, пока моя функция «read» не получит значение из «write»? –

+1

Да, точно. Таким образом, каналы могут использоваться для синхронизации выполнения не только для передачи данных. –

+0

Спасибо, друг! Очень ценю, что вы нашли время! –

Смежные вопросы