gccで、スレッド間で同じメモリを同時にアクセスしてる人を探してぶっ殺したい。
そのためにはgccの TSAN(Thread Sanitizer)機能を使う
-fsanitize=thread
ソース
#include <pthread.h> #include <stdio.h> volatile long long A=0; void *gettidtest( void *arg ) { int number = (int)(long) arg; long long i; printf("thread=%d start\n", number); for(i=0;i<1000000LL;i++){ A++; // 排他制御なし // __atomic_add_fetch( &A, 1, __ATOMIC_RELAXED ); // アトミック加算 } printf("thread=%d end\n", number); return NULL; } int main( int argc, char **argv ) { int i; pthread_t p[10]={}; for(i=0;i<10;i++){ pthread_create( &p[i], NULL, gettidtest, (void*)(long)i ); } for(i=0;i<10;i++){ pthread_join( p[i], NULL ); } printf("A=%lld\n",A); return 0; }
コンパイル
$ gcc -g -fsanitize=thread thread.c
実行結果
競合したところを教えてくれる