You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thread Sanitizer的Read与Previous Write告警如何解读及抑制

Thread Sanitizer数据竞争告警解读与抑制方案

理解正确性判断

你的理解基本正确,该告警是典型的多线程无同步访问导致的数据竞争(data race),是多线程编程中的高危问题,会触发程序未定义行为。

告警详细拆解

你收到的告警各字段含义如下:

==================
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...]
==================
  • 核心问题:主线程和T27线程在无任何同步机制(互斥锁、原子操作、线程join等)的前提下,同时访问同一块内存地址,且存在写入操作,符合数据竞争的判定条件
  • 访问行为:主线程对地址0x7f7eefc4e298执行4字节读,T27线程此前对同一地址执行8字节写
  • 内存归属:目标地址属于T27线程分配的堆内存块,T27线程本身由主线程创建

抑制告警方案

注意:优先排查修复数据竞争逻辑,抑制仅作为确认该竞争无实际风险后的临时方案,盲目抑制会遗漏真实bug

方法1:通过抑制规则文件屏蔽

无需修改代码,通过TSan自带的抑制规则实现:

  1. 新建抑制规则文件(例如命名为tsan_suppr.txt),写入匹配规则,只要告警的调用栈中包含规则对应的函数名,该告警就会被屏蔽:
# 规则格式:race:<需要匹配的函数名>
# 示例:匹配读操作栈中的main函数
race:main
# 示例:匹配T27线程执行的工作函数
race:worker_thread_func
  1. 运行程序前加载抑制文件:
    export TSAN_OPTIONS="suppressions=./tsan_suppr.txt"

方法2:代码层面标记忽略

如果明确对应访问逻辑安全,可以在代码中添加TSan注解屏蔽特定检测:

  • 标记整个函数不参与TSan检测:
__attribute__((no_sanitize("thread")))
void your_func() {
    // 函数内所有内存访问都不会触发TSan告警
}
  • 忽略特定地址的单次读写:
// 忽略目标地址的4字节读检测
__tsan_ignore_read((void*)0x7f7eefc4e298, 4);
// 忽略目标地址的8字节写检测
__tsan_ignore_write((void*)0x7f7eefc4e298, 8);

内容的提问来源于stack exchange,提问作者fabian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:24:04