识别不同线程同时使用的线程不安全数据结构

时间:2019-05-22 15:48:22

标签: c++ multithreading thread-safety

有一个遗留项目,其中包含成千上万的SLOC,并运行许多不同的线程。

有一个包含非原子成员的数据结构,理论上可以由不同的线程使用,但是由于代码的高度复杂性,可能难以通过简单的代码分析来识别这种情况。

时间不一定总会导致崩溃,但可能会发生(例如,该成员使用堆)。

是否有任何方法可以识别此类变量,例如在测试过程中,是否使应用程序在线程第一次访问此变量期间崩溃,而该线程不同于之前访问它的线程?

1 个答案:

答案 0 :(得分:1)

您可以尝试将clang++ThreadSanitizer结合使用。这涉及使用-fsanitize=thread -ltsan重新编译代码并执行它。 TSan应该检测数据争用,并给您堆栈跟踪以找出导致它们的原因。

  

ThreadSanitizer是检测数据争用的工具。它由一个编译器检测模块和一个运行时库组成。 ThreadSanitizer引入的典型速度下降约为5倍至15倍。 ThreadSanitizer引入的典型内存开销约为5x-10x。