为了账号安全,请及时绑定邮箱和手机立即绑定

单通道去例行死锁

单通道去例行死锁

Go
哔哔one 2021-11-15 15:44:00
我最近开始学习围棋,但遇到了一个问题。我有一个简单的 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}
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

一种可能的解决方案是避免选择语句并为接收者(或发送者,或两者)使用单独的 goroutine。例子:


package main    

import "sync"


func worker(res chan bool, wg *sync.WaitGroup) {

    res <- true

    wg.Done()

}


func receiver(res chan bool, wg *sync.WaitGroup) {

    for range res {

    }

    wg.Done()

}


func main() {

    var wg, wg2 sync.WaitGroup

    wg.Add(1)

    wg2.Add(10)

    found := make(chan bool)

    go receiver(found, &wg)

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

        go worker(found, &wg2)

    }

    wg2.Wait()

    close(found)

    wg.Done()

}


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信