race-detector
介绍:
数据竞争是程序错误中隐藏最深、最难理解的。它们经常在代码部署到生产环境上很久后,造成不规则、神秘的失败。go语言的并发机制使得go语言可以很轻易的写出清晰的并发代码,但是依旧无法阻止数据竞争。小心、努力、测试是必要的。并且工具可以提供帮助。
我们很开心的宣布,go1.1包含竞争检查器,一个在go代码中检测竞争的新的工具。目前在64位x86处理器上的linux、osx、win上有效。
竞争检查器基于c/c++的 ThreadSanitizer运行时库,其已经在google的基础代码库与chromiun中发现了许多错误。这个技术在2012年9月被整合进go,然后就发现了go标准库的42个错误,现在是我们持续构建进程的一部分,可以持续发现竞争场景。
如何工作:
竞争检查器被整合进go工具链,当 -race 命令行参数被设置的时候,编译器用记录内存访问时间和方式的代码来对所有内存访问进行检测,而运行库则监视对共享变量的非同步访问,当这种行为被发现时,将会打印一个警告。
由于其设计,这个竞争检查器只会在实际运行代码触发的情况下检测到竞争场景,这意味着在实际的工作负载下运行支持竞争的二进制文件非常重要。然后,支持竞争检查的二进制文件会使用数十次cpu和内存,所以,一直开启竞争检查器是不明智的。一种摆脱这种窘境的方法是在支持竞争检查的下进行一些测试。加载测试、整合测试是一个好的候选办法,因为其尝试去执行代码的并发部分。使用生产工作负载的另一种方法是在运行的服务器池中部署一个支持race的实例。
使用竞争检查器:
竞争检查器已经完整整合进go工具链。只要在命令行添加 -race选项,就能在构建代码的时候,开启竞争检查器。
结论: 竞争检查器是一个并发代码准确性的一个强有力的工具。它不会发出误报,所以要认真对待它的警告。但是它只和你的测试一样的好;你必须确保它们彻底地执行代码的并发属性,这样竞争检测器才能完成它的工作。使用go test -race吧!
https://medium.com/@val_deleplace/does-the-race-detector-catch-all-data-races-1afed51d57fb