首页 > 解决方案 > 识别不同线程同时使用的线程不安全数据结构

问题描述

有一个遗留项目包含数十万个 SLOC 并运行许多不同的线程。

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

计时并不总是会导致崩溃,但它可能会发生(例如,此成员使用堆)。

有什么方法可以识别这些变量,或者例如在测试期间,使应用程序在与之前访问它的线程不同的线程首次访问该变量期间崩溃?

标签: c++multithreadingthread-safety

解决方案


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

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


推荐阅读