Golang实践经验和教训(13)
default:
timeout.callback(timeout.session)
()
最后 , 这可以确保仅在遇到锁之后才执行回调 , 并且不会触发取消 。
死锁
此解决方案似乎有效;但是存在一个潜在的隐患——死锁 。
仔细检查代码 , 考虑并发调用的方法 。 问题在cancel通道本身 。 我们将其设置为无缓冲通道 , 这意味着其发送是阻塞调用 。 在超时处理程序中调用\"取消\"后 , 只有在该处理程序被取消后才能继续操作 。 这里的问题是 , 当有多个调用到同一取消通道时 , 取消请求仅使用一次 。 如果并发事件要取消相同的超时处理程序 , 例如链接断开或控制数据包事件 , 则很容易发生这种情况 。 这将导致死锁 , 可能会使应用程序停止 。
应对该死锁问题的解决方案是让通道缓冲一下 , 让发送并不总是阻塞 , 并且在并发调用的情况下显式使发送变为非阻塞 。 这样可以确保取消发送一次 , 并且不会阻止后续的取消调用 。
推荐阅读
- 原神|原神:不要专门跑去抽4星,以前的教训,让人印象深刻
- 手机游戏|于月仙事件的惨痛教训:不要雇佣一个“手游上瘾”的人!
- edg战队|FPX战胜EDG打出3个名场面,圣枪哥装杯被新人教训,Viper化身院长
- RNG|没有吸取DK的教训?RNG差点“翻车”,米勒说出心里话
- 梦幻西游|梦幻西游:男子沉迷于游戏,半年亏掉30多万,血与泪的教训!
- 大话西游|大话西游2(299)痛的教训!02年老玩家提示不要拿垃圾刷熟练度啊
- 暴雪|暴雪吸取了教训,《暗黑破坏神2:复活》测试的效果还不错
- 我的世界|我的世界:10个“过来人”的经验教训,处理好细节才能笑到最后!
- 华为|又想骗中国放弃自研?特朗普同意解封华为,损失1000亿后买来教训
- 华为|台积电之后,美国瞄准中芯国际?华为余承东:这是教训!