Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 识别不同线程同时使用的线程不安全数据结构_C++_Multithreading_Thread Safety - Fatal编程技术网

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

C++ 识别不同线程同时使用的线程不安全数据结构,c++,multithreading,thread-safety,C++,Multithreading,Thread Safety,有一个遗留项目,它包含数十万个SLOC,并运行许多不同的线程 有一个包含非原子成员的数据结构,理论上可以由不同的线程使用,但由于代码的高度复杂性,可能很难从简单的代码分析中识别这种情况 计时并不总是导致崩溃,但它可能会发生(例如,此成员使用堆) 是否有任何方法可以识别此类变量,例如,在测试过程中,使应用程序在线程首次访问此变量时崩溃,这与之前访问它的线程不同?您可以尝试使用clang++。这涉及到使用-fsanizize=thread-ltsan重新编译代码并执行它。TSan应该检测数据竞争,并

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

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

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


是否有任何方法可以识别此类变量,例如,在测试过程中,使应用程序在线程首次访问此变量时崩溃,这与之前访问它的线程不同?

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

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


您可能想看看:这个变量是通过getter访问的,还是直接通过对象访问的?@NathanOliver该变量是一个私有成员,在公共域中被覆盖method@DavideSpataro这是一个好主意,我不知道这样的工具。另一方面,作为开发人员,我希望能够将变量标记为不安全的,并让其他使用此结构的开发人员考虑线程安全。(可用于Clang和GCC)非常适合发现此类问题。