Data races and the limits of ThreadSanitizer in C and Go
3 days ago
- 数据竞争是不确定性的并发错误;像ThreadSanitizer(TSan)这样的竞争检测器可以帮助发现它们。
- 大多数竞争检测器使用LLVM的TSan,它经历了三个版本的演变,当前版本是v3。
- TSan使用向量时钟(类似于FastTrack)来跟踪线程顺序并检测竞争。
- TSan有预算限制:最多255个线程,14位同步释放计数器,以及每个8字节内存颗粒4个访问历史单元。
- 当超出这些预算阈值时(例如,线程过多、释放次数过多或对同一内存的不同访问过多),TSan可能会遗漏真实的数据竞争。
- Go的sync.Pool可能因为一个128槽的哈希表而隐藏竞争,该表在不相关的goroutine之间创建了错误的顺序。
- 尽管存在局限性,TSan仍然是检测C和Go程序中数据竞争的有价值工具。