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

【字号: 日期:2024-03-10浏览:48作者:雯心
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解决Goroutine睡眠和代码死锁怎么解决呢??

您至少需要初始化您的频道(如果频道为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 mainimport '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) boolfunc main() { var ch chan int = make(chan int) go Walk(tree.New(1), ch) for i := range ch {fmt.Println(i) }}解决方法

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

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

我想念什么?

package mainimport '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

相关文章: