理解 Go 中的死锁

我从编程课程中给出的示例中摘录了以下摘录,我不确定为什么会发生死锁。


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

}()

对此的任何解释都非常感谢。错误消息是:致命错误:所有 goroutine 都处于睡眠状态 - 死锁!


goroutine 1 [chan 发送]: main.main()


Smart猫小萌
浏览 176回答 1
1回答

长风秋雁

通道阻塞发送者和接收者。如果您发送某些东西,您将被阻止,直到收到为止。您可以进一步减少代码,您只需要一个通道,然后写入该通道。请注意,您还可以使用缓冲通道,它允许写入到缓冲区长度而不会阻塞。但是,如果缓冲区已满,它仍然会阻塞。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go