为了账号安全,请及时绑定邮箱和手机立即绑定

理解 Go 中的死锁

理解 Go 中的死锁

Go
Smart猫小萌 2022-05-10 13:37:55
我从编程课程中给出的示例中摘录了以下摘录,我不确定为什么会发生死锁。package mainimport (    "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()
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

通道阻塞发送者和接收者。如果您发送某些东西,您将被阻止,直到收到为止。您可以进一步减少代码,您只需要一个通道,然后写入该通道。请注意,您还可以使用缓冲通道,它允许写入到缓冲区长度而不会阻塞。但是,如果缓冲区已满,它仍然会阻塞。



查看完整回答
反对 回复 2022-05-10
  • 1 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号