当前位置: 首页 > 面试题库 >

Goroutine睡眠和代码死锁。怎么解决呢?

罗飞宇
2023-03-14
问题内容

http://play.golang.org/p/r92-KtQEGl

我正在尝试执行此代码。它将引发死锁错误。

我想念什么?

package main

import "tour/tree"
import "fmt"

// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int){
    var temp chan int
    ch <- t.Value
    if t.Left!=nil{go Walk(t.Left,temp)}
    if t.Right!=nil{go Walk(t.Right,temp)}
    for i := range temp{
        ch <- i
    }
    close(ch)
}

// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool

问题答案:

您至少需要初始化您的频道(如果频道为nil,则范围将永远被阻塞)

  var temp chan int = make(chan int)
  var ch chan int = make(chan int)

请参阅http://play.golang.org/p/Gh8MZlyd3B(仍然处于死锁状态,但至少显示结果)

此版本使用 两个 临时通道,不会死锁:http :
//play.golang.org/p/KsnmKTgZ83

package main

import "tour/tree"
import "fmt"

// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
    var temp1 chan int = make(chan int)
    var temp2 chan int = make(chan int)
    ch <- t.Value
    if t.Left != nil {
        go Walk(t.Left, temp1)
    }
    if t.Right != nil {
        go Walk(t.Right, temp2)
    }
    if t.Left != nil {
        for i := range temp1 {
            ch <- i
        }
    }
    if t.Right != nil {
        for i := range temp2 {
            ch <- i
        }
    }
    close(ch)
}

// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool

func main() {
    var ch chan int = make(chan int)
    go Walk(tree.New(1), ch)
    for i := range ch {
        fmt.Println(i)
    }
}


 类似资料:
  • 问题内容: 给出以下简单的Go程序 我想知道是否有人可以启发我 谢谢 问题答案: 由于您从不关闭通道,因此范围循环将永远不会结束。 您不能在同一频道上发送结果。一种解决方案是使用其他解决方案。 您的程序可以这样修改:

  • 问题内容: 对于我的要求之一,我必须创建N个工作程序例程,该例程将由一个监视程序监视。所有工作程序完成后,监视程序必须结束。我的代码以死锁结尾,请帮忙。 问题答案: 您的monitorWorker永不死。当所有工作人员完成时,它将继续等待cs。这将导致死锁,因为其他任何东西都不会继续发送给CS,因此wg永远不会达到0。一种可能的解决方法是,当所有工作程序完成时,让监视器关闭通道。如果for循环在m

  • 问题内容: 例如,有没有一种我可以执行的方法 然后在需要时“唤醒”睡眠的goroutine? 我看到里面有一个,但是我无法调用它。有什么想法吗? 问题答案: 没有办法中断,但是,您可以使用和语句来获取所需的功能。 一个简单的例子来展示基本思想: http://play.golang.org/p/7uKfItZbKG 在此示例中,我们生成了一个信令goroutine来告知main停止暂停。主要是在两

  • 问题内容: 我想编写三个同时发送整数的并发go例程。现在,我的代码已正确编译,但是在第一次执行后,出现错误“所有goroutine都处于睡眠状态- 死锁!”。我试图找到错误,但是在代码逻辑中找不到任何错误。有人可以帮助我在我的代码中查找错误。我的代码如下。提前致谢。 谁能告诉我为什么我将Routine2和Routine3声明为go例程,为什么输出为[no output]。我是GO语言的新手,据我从

  • 问题内容: 下面的代码与硬编码的JSON数据一起正常工作,但是当我从文件中读取JSON数据时不起作用。我得到使用时的错误。 硬编码JSON数据的工作示例: 输出: 不起作用-读取JSON数据文件的示例: 输出值 主机 问题答案: 当主功能结束时,Go程序结束。 从语言规范 程序执行首先初始化主程序包,然后调用函数main。当该函数调用返回时,程序退出。它不等待其他(非主)goroutine完成。

  • 问题内容: 在进行工作之前,我一直遵循一种检查通道中是否有东西的模式: 这是基于这部视频的。这是我的完整代码: 如果您尝试运行它,则在打印将要中断的消息之前,我们最终将陷入僵局。自上次以来,当chan中没有其他内容时,tbh才有意义,因此我们试图拉出该值,因此出现此错误。但是这样的模式是不可行的。我如何使此代码起作用以及为什么会出现此死锁错误(大概此模式应该起作用?)。 问题答案: 鉴于您在一个频