ThreadSanitizer(TSan)是Clang/GCC提供的高精度动态数据竞争检测工具,需用支持版本编译全部代码、加-pthread和-O1,运行时报详细竞态信息,适用于调试而非生产环境。
ThreadSanitizer(TSan)是 Clang 和 GCC 提供的动态数据竞争检测工具,专为 C/C++ 多线程程序设计。它通过插桩内存访问指令、记录线程与锁状态,在运行时实时识别未同步的并发读写(data race),准确率高、误报少,是调试多线程 bug 的首选工具之一。
必须用支持 TSan 的编译器(Clang ≥ 3.2 或 GCC ≥ 4.8),且需同时编译所有源文件(包括第三方静态库,否则可能漏检):
clang++ -fsanitize=thread -g -O1 -pthread main.cpp -o main
g++ -fsanitize=thread -g -O1 -pthread main.cpp -o main
-fPIE -pie 编译可执行文件以支持插桩程序运行中一旦发现数据竞争,TSan 会立即打印带堆栈的详细报告
到 stderr,包含:
例如报告中出现 WARNING: ThreadSanitizer: data race,紧接着两段 “Read of size X at …” 和 “Previous write of size X at …”,即表示一个典型竞态。
TSan 基于 happens-before 模型,对某些模式需手动标注:
std::atomic 或 __atomic_* 系列函数访问的变量默认不报竞态;但若混用原子与非原子访问同一地址,仍会报警——这是正确行为,应统一为原子访问__tsan_acquire/__tsan_release 或 __attribute__((no_sanitize("thread"))) 局部禁用(慎用)TSan 不适合生产环境(性能下降 5–15×,内存开销 +2–3×),但非常适合 CI 和本地调试:
-fsanitize=thread 编译,配合 --gtest_filter=MyThreadTest.* 快速定位问题Tsan_OPTIONS="halt_on_error=1 abort_on_error=1 second_deadlock_timeout=5"
-fsanitize=thread,address 在 Clang 中合法,在 GCC 中不支持,应分开运行
# app
# 工具
# 栈
# ai
# c++
# 环境变量
# red
# 全局变量
# 接口
# 堆
# 线程
# 多线程
# Thread
# 并发
# bug
# 行号
# 需注意
# 这是
# 多个
# 适用于
# 不适合
# 而非
# 都用
# 第三方
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
C++如何获取CPU核心数?(std::thread::hardware_concurrency)
如何使用Golang匿名函数_快速定义临时函数逻辑
php在Linux怎么部署_LNMP环境搭建PHP服务的详细指南【指南】
php怎么下载安装后设置默认字符集_utf8配置步骤【详解】
Win10怎么关闭自动更新错误重启 Win10策略禁止失败补丁强制重启【防护】
Win11怎么开启空间音效_Windows11耳机杜比音效与Sonic设置
Win10系统映像怎么恢复 Win10使用系统映像还原电脑【指南】
XSLT怎么生成动态的HTML属性名和标签名
Win11怎么禁用键盘自带键盘_Win11笔记本禁用内置键盘方法【教程】
如何在Golang中验证模块完整性_Golanggo.sum校验与安全实践
mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】
如何使用Golang实现错误包装与传递_Golangfmt.Errorf%w使用实践
MySQL 中使用 IF 和 CASE 实现查询字段的条件映射
Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】
Windows10电脑怎么连接蓝牙设备_Win10蓝牙配对失败解决方法
Win11开机速度慢怎么优化_Win11系统启动加速设置指南【方法】
如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法
Golang如何实现基本的用户注册_Golang用户注册表单处理示例
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
如何解决Windows字体显示模糊的问题?(ClearType设置)
Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件
如何在 Go 应用中实现自动错误恢复与进程重启机制
Win11如何设置ipv6 Win11开启IPv6网络协议教程【步骤】
Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】
Mac版Final Cut Pro入门_Mac视频剪辑基础操作【教程】
Windows10蓝屏代码DPC_WATCHDOG_VIOLATION_Win10死机修复指南
如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践
Win11怎么关闭小组件_Win11禁用任务栏天气与小组件方法【设置】
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
如何在Golang中引入测试模块_Golang测试包导入与使用实践
php打包exe后无法写入文件_权限问题解决方法【教程】
Win11怎么设置开机密码_Windows11账户登录选项PIN码
Windows10如何更改日期格式_Win10区域设置短日期修改
php打包exe怎么传递参数_命令行参数接收方法【解答】
Windows 10怎么把任务栏放在屏幕上方_Windows 10解锁任务栏并拖动位置
Win11任务栏怎么调到左边_Win11开始菜单居左设置教程【步骤】
Win11快速助手怎么用_Win11远程协助连接教程【工具】
php8.4如何实现队列任务_php8.4redis队列简单实现方法【教程】
如何使用Golang进行HTTP服务性能测试_测量吞吐量和延迟
Python如何创建带属性的XML节点
如何在Golang中编写异步函数测试_Golang异步操作测试策略
Win10 BitLocker加密教程 Win10给磁盘驱动器上锁【安全】
Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】
Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法
php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】
Win11怎么忘记WiFi网络_Win11删除已保存无线连接【教程】
MAC如何修改默认应用程序_MAC文件后缀关联设置与打开方式更改【教程】
如何使用Golang defer优化性能_减少不必要的函数调用
Win11怎么开启远程桌面_Win11系统远程桌面启用开关
如何使用Golang实现基本类型比较_Golang比较操作符使用方法
2025-12-27
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。