Запись на тот же канал с несколькими горутинами

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

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

person Jakob Svenningsson    schedule 30.03.2015    source источник


Ответы (1)


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

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

person Grzegorz Żur    schedule 30.03.2015
comment
Спасибо. Итак, когда запись записала в ch, write2 будет ждать/блокировать, пока моя функция чтения не получит значение от записи? - person Jakob Svenningsson; 30.03.2015
comment
Да, точно. Таким образом, каналы можно использовать для синхронизации выполнения не только для передачи данных. - person Grzegorz Żur; 30.03.2015
comment
Спасибо друг! Очень ценю, что вы нашли время! - person Jakob Svenningsson; 30.03.2015