次の例を検討してください。
#include <iostream>
int main () {
int i = 0;
#pragma omp parallel
{
#pragma omp critical
{
++i;
}
}
std::cout << i;
}
yieldsでコンパイルしg++ -fopenmp -fsanitize=thread
て実行する
WARNING: ThreadSanitizer: data race (pid=9576)
Read of size 4 at 0x7ffdc170f600 by thread T1:
#0 main._omp_fn.0 (a.out+0x000000400d20)
#1 gomp_thread_start /build/gcc/src/gcc-5.2.0 /libgomp/team.c:118 (libgomp.so.1+0x00000000f42d)スレッド T2 による 0x7ffdc170f600 でのサイズ 4 の以前の書き込み:
#0 main._omp_fn.0 (a.out+0x000000400d35)
#1 gomp_thread_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:118 (libgomp .so.1+0x00000000f42d)場所はメインスレッドのスタックです。
メインスレッドによって作成されたスレッド T1 (tid=9578、実行中):
#0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895 (libtsan.so.0+0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796 (libgomp.so.1+0x00000000f98f)
#2 __libc_start_main (libc.so.6+0x00000002060f)メインスレッドによって作成されたスレッド T2 (tid=9579、実行中):
#0 pthread_create /build/gcc/src/gcc-5.2.0/libsanitizer/tsan/tsan_interceptors.cc:895 (libtsan.so.0+0x000000027a37)
# 1 gomp_team_start /build/gcc/src/gcc-5.2.0/libgomp/team.c:796 (libgomp.so.1+0x00000000f98f)
#2 __libc_start_main (libc.so.6+0x00000002060f)概要: ThreadSanitizer: データ競合 ??:0 main._omp_fn.0
私が見る限り、これは偽陽性です。これを回避する方法はありますか?
(clang と libomp で動作するものでも問題ありません。)