问题描述
我有类似以下的代码,在这里我一直在监听频道直到超时间隔。假设这个goroutine 1
select {
case <-time.After(TimeoutInterval):
mu.Lock()
defer mu.Unlock()
delete(msgChMap,index)
return ""
case msg := <-msgCh:
return msg
}
在其他地方,我有一个goroutine 2
,其运行方式如下,它从Map中获取相应的msgCh
,删除地图中的条目,然后通过通道发送消息。
mu.Lock()
msgCh,ok := msgChMap[index]
delete(msgChMap,index)
mu.Unlock()
if ok {
msgCh <- "yay"
}
似乎我可以从地图上获取消息频道msgCh
,尝试发送消息,但是由于TimeoutInterval
已经通过,因此没有人在收听该消息,并且我的代码将陷入等待侦听器的困境。如果在将yay
发送到msgCh
之后放了锁,似乎我可能会死锁,因为2
将等待通道的侦听器并且没有释放锁,但是1
不再监听,但需要锁定。
有什么通用模式可以避免在等待听众时陷入困境?也许去很聪明,不会被困在这里。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)