【发布时间】:2019-09-17 18:32:36
【问题描述】:
我正在尝试在给定的一段代码(在 ok.c 文件中)上使用 threadsanitizer:
clang -fsanitize=thread ok.c -w -I../runtime
这工作正常并且没有检测到数据竞争,但是当我尝试将 -fopenmp 选项提供给 sanitizer 时,它会转储终端,并在循环中显示可能存在数据竞争的位置。
clang -fsanitize=thread -fopenmp ok.c -w -I../runtime
Terminal output:
$
WARNING: ThreadSanitizer: data race (pid=7980)
Atomic read of size 1 at 0x7d680001f700 by thread T2:
#0 pthread_mutex_lock <null> (a.out+0x000000439b00)
#1 __kmp_reap_worker <null> (libomp.so.5+0x0000000477a2)
int l_3438[10]; //shared
int i;
#pragma omp parallel for
for (i = 0; i < 10; i++){
l_3438[i] = (-10L);
}
我也尝试使用共享和私有属性来使事情更清晰。
int l_3438[10]; //shared
int i;
#pragma omp parallel for shared(l_3438) private(i)
for (i = 0; i < 10; i++){
l_3438[i] = (-10L);
}
问题:使用线程清理器时是否需要 -fopenmp 标志? 谢谢。
【问题讨论】:
-
您是否担心会因为误报而导致编译器错误?
-
我不知道它是否给出误报。任何建议如何检查误报
-
你考虑过这个closely related answer。
标签: gcc clang openmp thread-sanitizer data-race