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

为什么所有的 goroutine 都死锁了?

为什么所有的 goroutine 都死锁了?

Go
慕莱坞森 2021-06-23 17:02:29
我是 Go 的新手,也在线程“throw: all goroutines are sleep”上看了一点,但我仍然想知道为什么这段代码会死锁。我相信我在 namesInDir 中放了一个数字,之后应该可以打印出来。似乎我无法将号码添加到频道 - 这让我感到困惑。任何人都可以帮助我?type uniprot struct{    namesInDir chan int}func main(){u := uniprot{}u.namesInDir = make(chan int)u.namesInDir <- 1//u.readFilenames(os.Args[1])u.printName()}   func (u* uniprot) printName(){    name := <-u.namesInDir    fmt.Println(name)}我得到了一些建议,我可以通过缓冲频道来作弊。为什么这不起作用?u.namesInDir = make(chan int, 100)u.namesInDir <- 1for i := 0; i < 10; i++ {    go u.printName()}
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

缓冲通道的工作原理是这样的


没有缓冲区的通道会阻塞发送方,直到接收方获取该值。在您的原始示例中,您只有一个 go 例程,因此当您发送整数时,所有 go 例程都会被阻止。缓冲区克服了这一点。或者运行两个 go 例程 - 一个发送和一个接收。


package main


import "fmt"


type uniprot struct {

    namesInDir chan int

}


func (u *uniprot) printName() {

    name := <-u.namesInDir

    fmt.Println(name)

}


func main() {

    u := uniprot{}

    u.namesInDir = make(chan int, 1) // Buffer added here

    u.namesInDir <- 1

    //u.readFilenames(os.Args[1])

    u.printName()

}


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信