理解真实世界中 Go 的并发 BUG( 四 )
文章插图
img
特定库函数:一些库函数内部会使用channel , 也可能导致非阻塞性bug 。 下图是一个与time包有关的bug 。 开发者想实现的是 , 要么收到Done信号 , 要么超时 , 然后再返回 。 但是含bug的版本先创建了超时时间为0的timer , 然后再判断参数dur是否大于0, 大于0的话修改timer 。 但是 , 当dur为0的情况下 , timer实际上一开始就被设置为有信号了 , 可能导致函数过早返回 。 解决方案是不要让timer过早创建 。
文章插图
img
非阻塞性bug的检测Go提供了数据竞争检测 , 在build的时候使用 -race 标志即可启用 。
文章的一些结论是 , 消息传递机制也容易造成bug , 情况并不比共享内存机制好 。 消息传递机制更多地会造成一些阻塞性bug , 比较少造成非阻塞性bug , 而且可以用于解决由于共享内存导致的非阻塞性bug 。
关于bug检测 , 目前很多在传统语言中针对共享内存的检测算法 , 在go中也是适用的 , 但是针对go的消息传递机制所引起bug的检测 , 还需研究 。
译者:Darlzan
译文链接:
推荐阅读
- 比尔盖茨预言:中国这项科技研发成功,美国无法制裁世界迎来变革
- 英国专家:中国这项科技令世界畏惧,而他们自己却没有丝毫察觉
- 为什么苹果用户哪怕买二手机,都不用安卓?三点原因太真实
- 波士顿动力机器人组团出道,再次惊呆了全世界
- 华中科大教授团队攻克5G世界性难题 让5G手机坐汽车都不掉速
- 世界最小手机发售:31克 打火机那么大
- 达人打造《我的世界》矿物块主题树莓派机箱
- 168天封顶!投资56亿重点AI项目将在上海竣工,提供世界领先算力支撑
- 互联网快报丨钟睒睒入围世界富豪榜前八,排名巴菲特之后
- 号称世界最小手机!Zanco Tiny T2 发售