Я пытаюсь использовать резьбовой анализатор для данного фрагмента кода (в файле ok.c) как:
clang -fsanitize=thread ok.c -w -I../runtime
Это работает нормально, и гонки данных не обнаруживаются, но когда я пытаюсь дать опцию -fopenmpдля очистки он сбрасывает терминал с возможным расположением гонки данных в цикле.
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);
}
Я также попытался использовать атрибуты shared и private, чтобы сделать вещи более понятными.
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 при использовании средства очистки потока?Спасибо.