OpenMP - 预计数据竞争情况但实际上并没有发生
OpenMP - expect data race situation but did not actually occur
我写了下面的代码,我预计会发生数据竞争,因为多个线程可能同时修改 a
并得到错误的答案。
// test.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a = 0;
#pragma omp paralle for
for (int i = 0; i < 10000000; i++) {
a = a + 1;
}
printf("a = %d\n", a); // correct answer = 10000000
return 0;
}
但输出似乎是正确的:
$ gcc test.c -std=c99 -fopenmp
$ ./a.out
a = 10000000
我已经执行了好几次了,它总是给我正确的答案。
为什么没有数据竞争发生?是巧合吗?
(我知道我应该使用 reduction
但我只是想知道为什么它在没有 reduction
的情况下仍然可以正常工作。)
你写的是 #pragma omp paralle for
而你的意思是 #pragma omp parallel for
(注意 parallel 而不是 paralle)。如果你解决了这个问题,你就会看到你的数据竞争。
我写了下面的代码,我预计会发生数据竞争,因为多个线程可能同时修改 a
并得到错误的答案。
// test.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a = 0;
#pragma omp paralle for
for (int i = 0; i < 10000000; i++) {
a = a + 1;
}
printf("a = %d\n", a); // correct answer = 10000000
return 0;
}
但输出似乎是正确的:
$ gcc test.c -std=c99 -fopenmp
$ ./a.out
a = 10000000
我已经执行了好几次了,它总是给我正确的答案。
为什么没有数据竞争发生?是巧合吗?
(我知道我应该使用 reduction
但我只是想知道为什么它在没有 reduction
的情况下仍然可以正常工作。)
你写的是 #pragma omp paralle for
而你的意思是 #pragma omp parallel for
(注意 parallel 而不是 paralle)。如果你解决了这个问题,你就会看到你的数据竞争。