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

我是 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 <- 1

for i := 0; i < 10; i++ {

    go u.printName()

}


慕莱坞森
浏览 173回答 1
1回答

慕的地10843

缓冲通道的工作原理是这样的。没有缓冲区的通道会阻塞发送方,直到接收方获取该值。在您的原始示例中,您只有一个 go 例程,因此当您发送整数时,所有 go 例程都会被阻止。缓冲区克服了这一点。或者运行两个 go 例程 - 一个发送和一个接收。package mainimport "fmt"type uniprot struct {&nbsp; &nbsp; namesInDir chan int}func (u *uniprot) printName() {&nbsp; &nbsp; name := <-u.namesInDir&nbsp; &nbsp; fmt.Println(name)}func main() {&nbsp; &nbsp; u := uniprot{}&nbsp; &nbsp; u.namesInDir = make(chan int, 1) // Buffer added here&nbsp; &nbsp; u.namesInDir <- 1&nbsp; &nbsp; //u.readFilenames(os.Args[1])&nbsp; &nbsp; u.printName()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go