以下是我的代码,我想知道为什么会发生“竞态条件”的问题,以及如何解决这个问题?
#include <iostream>
int main(){
int a = 123;
#pragma omp parallel num_threads(2)
{
int thread_id = omp_get_thread_num();
int b = (thread_id + 1)*10;
a += b;
}
std::cout << “a = “ << a << “\n”;
return 0;
}发布于 2021-11-20 09:32:49
当两个或多个线程访问共享数据,并且其中至少有一个线程同时更改其值时,就会出现争用条件。在您的代码中,这一行导致了竞争条件:
a += b;a是一个共享变量,由两个线程同时更新,因此最终结果可能不正确。请注意,根据所使用的硬件,可能的竞争条件并不一定意味着实际上会发生数据竞争,因此结果可能是正确的,但它是代码中的语义错误。
要修复它,您有两个选择:
#pragma omp atomic
a += b;#pragma omp parallel num_threads(2) reduction(+:a)https://stackoverflow.com/questions/70043455
复制相似问题