Понимание тупика в Go - PullRequest
       26

Понимание тупика в Go

0 голосов
/ 23 января 2020

У меня есть следующая выдержка из примера, приведенного в курсе программирования, и я не уверен, почему возникает тупик.

package main

import (
    "fmt"
)

var (
    Count      int = 0
    nFunctions int = 2
)

var sema = make(chan int)

func increment(ch chan int, nSteps int) {
    for i := 0; i < nSteps; i++ {
        <- sema  
        cnt := Count
        Count = cnt + 1
        ch <- 1
        sema <- 1
    }
    return
}

func main() {
    ch := make(chan int)
    sema <- 1
    go increment(ch, 1000)
    go increment(ch, 1000)

    for i := 0; i < nFunctions*1000; i++ {
        <-ch
    }

    fmt.Printf("Count = %d\n", Count)
}

Как ни странно, тупик не возникает, когда я изменяю оператор, в основном, от sema <- 1 до

go func () {
sema <- 1
}()

Любые объяснения этому очень ценятся. Сообщение об ошибке: фатальная ошибка: все программы находятся в спящем режиме - тупик!

программа 1 [chan send]: main.main ()

1 Ответ

2 голосов
/ 23 января 2020

Каналы блокируют как отправителя, так и получателя. Если вы отправляете что-то, вы блокируетесь, пока оно не будет получено. Вы могли бы уменьшить свой код еще больше, все, что вам нужно, это канал, а затем писать на этот канал. Обратите внимание, что вы также можете использовать буферизованный канал , который позволяет выполнять запись до длины буфера без блокировки. Однако, если буфер заполнен, он все равно блокируется.

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