首页 > 解决方案 > 在永远循环中从两个通道读取输出

问题描述

我正在研究tour.golang的树练习。我试图实现与下面编写的相同的功能。

func Same(t1, t2 *tree.Tree) bool {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go Walk(t1, ch1);
    go Walk(t2, ch2);

    for c := range ch1 {
        d := <- ch2
        if c-d !=0 {
            return false
        }   

    }
    return true
}

使用永远循环,我想比较 from 的输出ch1是否与ch2. 但以下是抛出此错误:

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

现场版

标签: go

解决方案


您应该在遍历树后关闭通道以终止范围循环,以防树相等(注意:Same当树的中缀遍历相等时返回 true,它们的结构不需要相等)。

func WalkTreeAndThenCloseChannel(t *tree.Tree, ch chan int) {
    Walk(t, ch)
    close(ch)
}

func Same(t1, t2 *tree.Tree) bool {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go WalkTreeAndThenCloseChannel(t1, ch1);
    go WalkTreeAndThenCloseChannel(t2, ch2);

注意:您应该检查第二个通道是否已关闭,以防树有不同数量的项目并且没有发现差异(“线程饥饿”在这里比“死锁”更合适)。


推荐阅读