理解真实世界中 Go 的并发 BUG( 四 )


理解真实世界中 Go 的并发 BUG文章插图
img
特定库函数:一些库函数内部会使用channel , 也可能导致非阻塞性bug 。 下图是一个与time包有关的bug 。 开发者想实现的是 , 要么收到Done信号 , 要么超时 , 然后再返回 。 但是含bug的版本先创建了超时时间为0的timer , 然后再判断参数dur是否大于0, 大于0的话修改timer 。 但是 , 当dur为0的情况下 , timer实际上一开始就被设置为有信号了 , 可能导致函数过早返回 。 解决方案是不要让timer过早创建 。
理解真实世界中 Go 的并发 BUG文章插图
img
非阻塞性bug的检测Go提供了数据竞争检测 , 在build的时候使用 -race 标志即可启用 。
文章的一些结论是 , 消息传递机制也容易造成bug , 情况并不比共享内存机制好 。 消息传递机制更多地会造成一些阻塞性bug , 比较少造成非阻塞性bug , 而且可以用于解决由于共享内存导致的非阻塞性bug 。
关于bug检测 , 目前很多在传统语言中针对共享内存的检测算法 , 在go中也是适用的 , 但是针对go的消息传递机制所引起bug的检测 , 还需研究 。
译者:Darlzan
译文链接: