致命错误,所有的goroutine都处于休眠状态,发生了死锁。

huangapple go评论96阅读模式
英文:

fatal error all goroutines are asleep deadlock

问题

以下是错误的解释:

致命错误:true
true
所有的goroutine都处于休眠状态-死锁!

这个错误是由于在程序中存在死锁引起的。死锁是指在并发程序中,多个goroutine相互等待对方释放资源而无法继续执行的情况。

在你的代码中,你创建了一个缓冲大小为2的通道c,然后启动了5个goroutine来向通道发送数据。然而,由于通道的缓冲大小只有2,当第3个goroutine尝试向通道发送数据时,由于通道已满,它会被阻塞。而其他的goroutine也会因为通道已满而被阻塞,导致所有的goroutine都处于休眠状态,无法继续执行,从而引发了死锁。

要解决这个问题,你可以增加通道的缓冲大小,或者使用其他的同步机制来避免死锁的发生。

英文:

Can you explain the following error: fatal error:
<br>true
<br>true
<br>all goroutines are asleep - deadlock!<br>

package main

import (
	&quot;fmt&quot;
)

func printer(ch chan bool) {
	ch &lt;- true
}

func main() {
	var c chan bool = make(chan bool, 2)

	for i := 0; i &lt; 5; i++ {
		go printer(c)
	}

	for i := range c {
		fmt.Println(i)
	}
}

答案1

得分: 7

因为通道c没有关闭,所以范围循环不会退出。这段代码不会阻塞:

func main() {
    var c chan bool = make(chan bool, 2)

    for i := 0; i < 5; i++ {
        go printer(c)
    }

    for i := 0; i < 5; i++ {
        fmt.Println(<-c)
    }
}

playground示例

英文:

Because the channel c is not closed, the range loop does not exit. This code will not block:

func main() {
  var c chan bool = make(chan bool, 2)

  for i := 0; i &lt; 5; i++ {
	go printer(c)
  }

  for i := 0; i &lt; 5; i++ {
	fmt.Println(&lt;-c)
  }
}

<kbd>playground example</kbd>

huangapple
  • 本文由 发表于 2016年1月3日 08:19:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/34572122.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定