登录
首页 >  Golang >  Go问答

所有 goroutine 都处于休眠状态 - 死锁

来源:Golang技术栈

时间:2023-04-10 14:30:33 393浏览 收藏

本篇文章给大家分享《所有 goroutine 都处于休眠状态 - 死锁》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

对于我的要求之一,我必须创建 N 个工人 go 例程,这些例程将由一个监控例程进行监控。当所有工作程序完成时,监控程序必须结束。我的代码以死锁结尾,请帮忙。

import "fmt"
import "sync"
import "strconv"

func worker(wg *sync.WaitGroup, cs chan string, i int ){
    defer wg.Done()
    cs
<h2 class="daan">
    正确答案
</h2>
<p>你的 monitorWorker 永远不会死。当所有工作人员完成后,它会继续等待 cs。这种死锁是因为在 cs 上不会发送任何其他内容,因此 wg
永远不会达到 0。一个可能的解决方法是让监视器在所有工作人员完成后关闭通道。如果 for 循环在 main 中,它将结束循环,从 main
返回,并结束程序。</p>
<p>例如:<a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXpusdyfr5Z5fZqwoZXamqqqrpLfZabFn5OqyHxxpYmQpGu8q7iNiImR3q2tfs6B3LKkkrqBZK92gqC0jYqbfaN-a77Qs7GDhp6as3uG3oaVsbOFmIVhu6yKnrSKdW0' rel='nofollow'>http ://play.golang.org/p/nai7XtTMfr</a></p>
<pre class="brush:go;toolbar:false">package main

import (
    "fmt"
    "strconv"
    "sync"
)

func worker(wg *sync.WaitGroup, cs chan string, i int) {
    defer wg.Done()
    cs 
<hr><p><strong>编辑:</strong> 这是对 OP 第一条评论的回答。</p>
<p>您的程序包含三个需要同步的部分。首先,您的所有工作人员都需要发送数据。然后您的打印循环需要打印该数据。然后你的 main
函数需要返回从而结束程序。在您的示例中,所有工作人员都发送数据,所有数据都被打印,但消息永远不会发送到 main ,它应该正常返回。</p>
<p>在我的示例中,main 执行打印,而“monitorWorker”只是告诉 main 何时收到需要打​​印的每条数据。这样程序就会优雅地结束,而不是死锁。</p>
<p>如果你坚持打印循环在另一个 goroutine 中,你可以这样做。但是随后需要向 main
发送额外的通信,以便它返回。在下一个示例中,我使用通道来确保打印所有数据时的主端。</p>
<pre class="brush:go;toolbar:false">package main

import (
    "fmt"
    "strconv"
    "sync"
)

func worker(wg *sync.WaitGroup, cs chan string, i int) {
    defer wg.Done()
    cs <p>今天关于《所有 goroutine 都处于休眠状态 - 死锁》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!</p>
声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>