23 June 2023

C++ 核心指南目录

“Whenever feasible use tools to validate your concurrent code”

经验表明,把并行计算代码设计正确非常困难。而且编译时检查、运行时检查以及测试都很难有效的发现并行计算中的错误。一些细微的并行错误会导致很严重的后果,包括内存错乱、死锁以及安全漏洞。

注意

做到线程安全是非常有难度的。经常需要非常有经验的程序员:一个重要的策略是利用工具规避这些风险。有很多商业的与开源的、研究性的与生产性的工具可以利用。但是人们的需求和限制条件千差万别,所以我们也无法提供放之四海而皆准的建议。不过可以提一些:

  • 静态强化工具: clang 和老版本的 GCC 提供一些静态标注关键字去标注线程安全属性。准确的使用这些技术可以把很多类线程安全问题转换成编译时错误。这些标注一般都是局部的,比如用特定互斥锁保护某个特定成员变量。这种方法也很容易习得。然而,与其他很多静态工具一样,也经常会出现误报的情况,也有应该要报警却没有发现的情况。
  • 动态强化工具:clang thread sanitizer (即 TSAN )是一个强大的动态工具:它能修改编译过程,添加内从访问检查语句,执行你的程序,识别出可能存在的数据竞争情况。其代价有两方面,一方面内存会增加 5-10 倍,另一方面, CPU 运行速度会慢 2-20 倍。这类动态工具最好应用于集成测试、 canary push 或有多个线程的单元测试。如果 TSAN 发现问题,就是实际存在的数据竞争情况,但是也仅仅是在当前执行过程中出现的情况。

强化

根据实际应用开发者的需求,选择最有价值的支持工具。