利用Thread Sanitizer工具检查数据竞争的问题

例子

#include <pthread.h>
int Global;
void *Thread1(void *x) {
  Global = 42;
  return x;
}
int main(void) {
  pthread_t t;
  pthread_create(&t, NULL, Thread1, NULL);
  Global = 43;
  pthread_join(t, NULL);
  return Global;
}

技巧

gcc从4.8版本起,集成了Address Sanitizer工具,可以用来检查数据竞争的问题(编译时指定“-fsanitize=thread -fPIE -pie”)。以上面程序为例:

gcc -fsanitize=thread -fPIE -pie -g -o a a.c -lpthread

执行a程序:

[root@localhost nan]# ./a
==================
WARNING: ThreadSanitizer: data race (pid=14545)
  Write of size 4 at 0x7f055b4802b0 by thread T1:
    #0 Thread1 /home/nan/a.c:4 (a+0x000000000a87)

  Previous write of size 4 at 0x7f055b4802b0 by main thread:
    #0 main /home/nan/a.c:10 (a+0x000000000ae8)

  Location is global 'Global' of size 4 at 0x7f055b4802b0 (a+0x0000002012b0)

  Thread T1 (tid=14547, running) created by main thread at:
    #0 pthread_create /opt/gcc-4.9.2/src/gcc-4.9.2/libsanitizer/tsan/tsan_interceptors.cc:877 (libtsan.so.0+0x00000004aa83)
    #1 main /home/nan/a.c:9 (a+0x000000000ad9)

SUMMARY: ThreadSanitizer: data race /home/nan/a.c:4 Thread1
==================
ThreadSanitizer: reported 1 warnings

可以看到,执行程序时检测出了对Global变量的竞争访问。
详情参见gcc手册

贡献者

nanxiao