c++ - 识别不同线程同时使用的线程不安全数据结构
问题描述
有一个遗留项目包含数十万个 SLOC 并运行许多不同的线程。
有一个包含非原子成员的数据结构,理论上可以被不同的线程使用,但是由于代码的高度复杂性,可能很难从简单的代码分析中识别这种情况。
计时并不总是会导致崩溃,但它可能会发生(例如,此成员使用堆)。
有什么方法可以识别这些变量,或者例如在测试期间,使应用程序在与之前访问它的线程不同的线程首次访问该变量期间崩溃?
解决方案
您可以尝试clang++
与ThreadSanitizer一起使用。这涉及使用 重新编译代码-fsanitize=thread -ltsan
并执行它。TSan 应该检测数据竞争并为您提供堆栈跟踪以找出导致它们的原因。
ThreadSanitizer 是一种检测数据竞争的工具。它由一个编译器检测模块和一个运行时库组成。ThreadSanitizer 引入的典型减速约为 5x-15x。ThreadSanitizer 引入的典型内存开销约为 5x-10x。
推荐阅读
- terraform - 使用 terraform 转义字符串中的特殊字符
- css - CSS Hover TranslateY 与 Fluid Motion 而不是立即重置?
- javascript - TypeScript 不理解 Node.js 中库的“导入”。获取 SyntaxError:意外的标识符?
- tomcat - catalina.policy 上的所有权和文件权限应该是什么?
- .net - 如何在 .net 中使用 KSP 持久化密钥?
- java - java中为什么父类会调用子类方法?
- c++ - clang::ast_matchers::thisPointerType 对重载函数的模糊调用
- php - 带有 Psy shell 的 Laravel 8 交互式调试不起作用
- r - 为什么 gt::gt() 用“。”替换我的原始数据集的列名中的所有空格。在 RStudio 中?
- sql - 将 CSV 文件插入到 SQL Server 中的现有表中