关闭通道以进行信号广播

时间:2018-03-05 20:55:28

标签: go synchronization locking wait

我有一个应用程序,其中一个goroutine最终将计算一个值,此时任何数量的等待该值的例程都需要继续执行。这是一对多的通信问题,因此我通过跟踪等待的例程数量来解决通道和条件变量问题。此外,我希望广播是非阻塞的,并且将来会等待立即返回,因为值已知。

我最终得到了以下实现,其中关闭频道有效地广播该组,因为写入发生在任何读取之前不应该有任何比赛。虽然到目前为止工作得很好,但对我来说似乎有些迟钝。对于这个问题,是否有更惯用而又简单的解决方案?

type BroadcastGroup struct {
    ch      chan interface{}
    msg     interface{}
}

func (bg *BroadcastGroup) Broadcast(msg interface{}) {
    bg.msg = msg
    close(bg.ch)
}

func (bg *BroadcastGroup) Wait() interface{} {
    <-bg.ch
    return bg.msg
}

func NewBroadcastGroup() *BroadcastGroup {
    bg := &BroadcastGroup{}
    bg.ch = make(chan interface{}, 0)
    return bg
}

0 个答案:

没有答案