go - 在永远循环中从两个通道读取输出
问题描述
我正在研究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 都处于休眠状态 - 死锁!
解决方案
您应该在遍历树后关闭通道以终止范围循环,以防树相等(注意: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);
注意:您应该检查第二个通道是否已关闭,以防树有不同数量的项目并且没有发现差异(“线程饥饿”在这里比“死锁”更合适)。
推荐阅读
- amazon-ec2 - 使用 AWS_PING 在 EC2 上为 HA 配置 Wildfly 15
- c# - 列出主目录和子目录中的文件
- android - 即使 appAutoUpdatePolicy 设置为 ALWAYS,应用程序也不会更新
- python - 在 Flask 工厂设置中反映不同的数据库
- oracle - 如何避免 Oracle Ref 游标
- javascript - 我想应用过滤器:模糊到任何形状
- c# - 如何为多个测试类创建多个范围报告
- java - 如何以编程方式从 log4j2 中删除 ConsoleLogger?
- python - 如何使用标记将直方图转换为简单图?
- r - 闪亮的 img() 函数,我如何让图像出现?