揮発性のメモ2

http://d.hatena.ne.jp/iww/

gccで、スレッド間で同じメモリを同時にアクセスしてる人を探してぶっ殺したい

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
実行結果

競合したところを教えてくれる

問題点
  • 競合を発見しても終了しない
    -fno-sanitize-recover=all が効かず、検知後もプログラムは続行する
  • -fsanitize=address と一緒には使えない
    どちらか一方しか使えない
  • x86_64 でしかサポートしてない
    Cygwinもダメ、32bitもダメ、ARMもダメ