перейти на канал чтения параллелизма и блокировки - PullRequest
0 голосов
/ 17 октября 2018
import "fmt"

func sum(s []int, c chan int) {
    sum := 0
    for _, v := range s {
        sum += v
    }
    c <- sum // send sum to c
}

func main() {
    s := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
}

Привет, ребята. Это пример использования канала на официальном сайте.

В этом примере запускаются 2 процедуры для расчета суммы подмассива.затем он пишет в канал int.

Эта строка действительно смущает меня.

x, y := <-c, <-c // receive from c

Насколько я понимаю, когда первая подпрограмма записывается в канал, запись второй подпрограммы должна быть заблокирована, затем main считывает значение в x (или y).затем 2-ая процедура записывает в канал, main читает в x (или y).

Верно ли это предположение?

Как решить, какой результат будет передан x или y?

а если вторая процедура никогда не заканчивается, блокируется ли main на этой линии?

Заранее спасибо.иди сюда новобранец.

1 Ответ

0 голосов
/ 17 октября 2018

Насколько я понимаю, когда первая подпрограмма записывается в канал, запись второй подпрограммы должна быть заблокирована, затем main считывает значение в x (или y).затем 2-ая подпрограмма записывает в канал, main читает в x (или y).

Исправить, потому что она не буферизована.Если канал был буферизован, обе подпрограммы могли бы выполнять запись в него без блокировки до тех пор, пока буфер не будет заполнен.

Как решить, какой результат будет равен x или y?

Он "решает", какой результат получить в лексическом порядке - первое считанное значение переходит в первую переменную x, второе значение - во вторую переменную y.

и, если 2-я процедураникогда не заканчивается, блокируется ли main на этой линии?

Нет.Он блокируется до тех пор, пока значение не будет записано в канал, независимо от того, выполняются ли подпрограммы, записывающие данные в канал, или нет (действительно, подпрограммы могут продолжать работать и записывать значения в канал навсегда, если бы это было желаемое поведение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...