Могу ли я рассчитывать на порядок выбора пробуждений в зависимости от отправки заказа? - PullRequest
0 голосов
/ 28 ноября 2018

Представьте шаблон кода, подобный следующему:

var a chan T = make(chan T)
var b chan Q = make(chan Q)

//consumer goroutine
for {
   select {
   case <-a:
       //...
   case <-b:
       //...
   }
}

//producer goroutine
...
a <- x
b <- y
...

Гарантируется ли, что мы всегда сможем извлечь x из регистра: <-a ПЕРЕД y из регистра: <- b при условии, что существует только один производитель</p>

1 Ответ

0 голосов
/ 28 ноября 2018

Да, вы можете положиться на заказ, потому что канал a небуферизован.

Обмен данными по небуферизованному каналу успешен только тогда, когда отправитель и получатель готовы.Отправитель не выполняет после оператора a <- x, пока значение не будет получено.Из этого следует, что значения принимаются в порядке отправки.

Порядок не гарантируется, если канал a буферизован.Получатель может не выполняться, пока не будут отправлены оба значения.Когда получатель выполняет выполнение после отправки значений, нет гарантии, какая ветвь выбора будет выполняться первой.

...