Thread Sanitizer - 如何解释读取与先前写入警告

fab*_*ian 2 c++ multithreading gcc thread-sanitizer

我正在运行一个带有线程清理程序的程序,并且想知道如何解释以下警告:

==================
WARNING: ThreadSanitizer: data race (pid=2788668)
  Read of size 4 at 0x7f7eefc4e298 by main thread:
[Stacktrace follows...]
  Previous write of size 8 at 0x7f7eefc4e298 by thread T27:
[Stacktrace follows...]
  Location is heap block of size 307272 at 0x7f7eefc1c000 allocated by thread T27
[Stacktrace follows...]
  Thread T27 (tid=2790352, running) created by main thread at:
[Stacktrace follows...]
==================
Run Code Online (Sandbox Code Playgroud)

我将此消息解释为只是说主线程读取了先前由不同线程写入的内存。不同的线程是由主线程创建的,并且该不同的线程也分配了内存。它是否正确?如果是这样,有没有办法在接下来的运行中抑制这个特定的警告?

Qui*_*mby 5

该警告是一个真正的错误(除非它是误报)。

线程 T27 向地址写入 8 个字节,主线程随后在不锁定的0x7f7eefc4e298情况下读取该字节的前 4 个字节(据清理程序所知)。这是竞争条件和未定义的行为。

换句话说,访问0x7f7eefc4e298不受锁或其他同步原语的保护。是这样吗?

如果你坚持,有一种方法可以让它们保持沉默,supp.txt使用以下命令创建一个文件:

# Silences all races originating in bar_function
race:foo_namespace::bar_function
Run Code Online (Sandbox Code Playgroud)

然后使用环境变量集运行测试TSAN_OPTIONS="suppressions=supp.txt"。关于抑制文件格式的文档很少。另一个编译时选项使用-fsanitize-ignorelist它应该禁用仪器本身。