ThreadSanitizer(又称为TSan)是一个用于C/C++的数据竞争检测器。在并发系统中,数据竞争是最常见且最难调试的错误类型之一。当两个线程并发访问同一个变量,并且至少有一个访问是写操作时,就会发生数据竞争。C++11标准正式将数据竞争定义为未定义行为。
$ cat simple_race.cc
#include <pthread.h>
#include <stdio.h>int Global;void *Thread1(void *x) {Global++;return NULL;
}void *Thread2(void *x) {Global--;return NULL;
}int main() {pthread_t t[2];pthread_create(&t[0], NULL, Thread1, NULL);pthread_create(&t[1], NULL, Thread2, NULL);pthread_join(t[0], NULL);pthread_join(t[1], NULL);
}
g++ -fsanitize=thread -g k.cc
更多例子见https://github.com/google/sanitizers/wiki/ThreadSanitizerPopularDataRaces