猿问

单通道去例行死锁

我最近开始学习围棋,但遇到了一个问题。我有一个简单的 go 例程,它可以将值返回或推送到通道。我的主要 fn 委托工作到这个例程,直到它满足条件或数据耗尽。此代码似乎在“找到”频道上陷入僵局。我究竟做错了什么?

  • 有多个工人

  • 物品可以同时在多个工人身上找到

  • 一旦发现项目,应停止所有工人。

func workerRoutine(data Data, found chan bool, wg *sync.WaitGroup){


   defer (*wg).Done()

   // data processing

   // return on false 


   // multiple routines can set this at the same time

   found <-true

}


func main {


   // ....

   found:=make(chan bool)

   var wg sync.WaitGroup

   itemFound:=false

       Loop:

          for i:=0; i<limit; i++ {

              select {

                 case <-found:

                    itemFound = true

                    break Loop

                 default:

                    if(some_check) {

                       wg.Add(1)

                       go workerRoutine(mdata,found,&wg)

                    }

              }

       }


   wg.Wait()


   // use itemFound

}


哔哔one
浏览 125回答 1
1回答

繁星coding

一种可能的解决方案是避免选择语句并为接收者(或发送者,或两者)使用单独的 goroutine。例子:package main&nbsp; &nbsp;&nbsp;import "sync"func worker(res chan bool, wg *sync.WaitGroup) {&nbsp; &nbsp; res <- true&nbsp; &nbsp; wg.Done()}func receiver(res chan bool, wg *sync.WaitGroup) {&nbsp; &nbsp; for range res {&nbsp; &nbsp; }&nbsp; &nbsp; wg.Done()}func main() {&nbsp; &nbsp; var wg, wg2 sync.WaitGroup&nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; wg2.Add(10)&nbsp; &nbsp; found := make(chan bool)&nbsp; &nbsp; go receiver(found, &wg)&nbsp; &nbsp; for i := 0; i < 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; go worker(found, &wg2)&nbsp; &nbsp; }&nbsp; &nbsp; wg2.Wait()&nbsp; &nbsp; close(found)&nbsp; &nbsp; wg.Done()}
随时随地看视频慕课网APP

相关分类

Go
我要回答