data races
1 min read

data races

虽然go建议使用channel在gorouting之间传递数据而不是共享内存,但不强制,于是就总会心怀侥幸的做法。比如这篇介绍go race detector的文章,就讲了标准库io.Discard在实现中遇到的问题。

开始时,作为代码优化,认为临时缓存可以共享一份,反正内容无人关注最后也是丢掉。甚至为了绕过race detector的警告,还专门写了两份代码以应付检查。但是,既然警告了,就是有危险,总有爆雷的时候。终于有一天,有个公司的代码里使用了这个临时缓存。事后来看,这个逻辑很正常啊,没人想到这块内存会跟人共享,于是就出问题了。最后的解决办法还是用channel来共享并保证同步,很巧妙但只有一份能共享(最新的代码已改用sync.poll)。

另外,不要以为多线程并发才会有race的问题。其实就算单线程,也可能有类似的问题,请参见这篇文章

这也就是我觉得Rust好的地方,完全没机会侥幸,代码就直接编译不过(这同时也是Rust让人痛苦的地方)。