Thread Sanitizer是基于LLVM的适用于Swift和C语言的检测数据竞争的工具。当多个线程在非同步的情况下访问同一内存且至少有一个是写操作时,就会发生数据竞争。数据竞争是非常危险的,可能导致程序的行为无法预测,甚至导致内存损坏。Thread Sanitizer还可以检测其他类型线程错误,包括未初始化的互斥锁和线程泄漏。
Thread Sanitizer的原理
Thread Sanitizer会记录每一个内存访问的信息,并检测该访问是否参与了竞争。代码中所有的内存访问都会被编译器转换为如下形式:
// Before
*address = ...; // or: ... = *address;
// After
RecordAndCheckWrite(address);
*address = ...; // or: ... = *address;
对性能的影响
开启Thread Sanitizer,将使代码执行效率降低2-20倍,内存使用增加5-10倍。可以通过设置-O1
优化级别来提高内存利用率。
如何开启Thread Sanitizer?
在Xcode中操作:
你也可以通过命令行的方式启用Thread Sanitizer。
- clang
-fsanitize=thread
- swiftc
-sanitize=thread
- xcodebuild
-enableThreadSanitizer YES
Thread Sanitizer能干什么?
- 数据多线程访问;
- 访问未初始化的锁;
- 线程使用完未释放。
留言板