Multithreading OpenMP中的共享变量

Multithreading OpenMP中的共享变量,multithreading,openmp,shared-memory,Multithreading,Openmp,Shared Memory,关于OpenMP中的共享变量,我有一个非常基本的问题(可能很愚蠢)。考虑下面的代码: void main() { int numthreads; #pragma omp parallel default(none) shared(numthreads) { numthreads = omp_get_num_threads(); printf("%d\n",numthreads); } } 现在所有线程的numthreads值都相同。由于不同的线程正在将相同的值写入同一个变量,是否有

关于OpenMP中的共享变量,我有一个非常基本的问题(可能很愚蠢)。考虑下面的代码:

void main()
{
int numthreads;
#pragma omp parallel default(none) shared(numthreads)
 {
  numthreads = omp_get_num_threads();
  printf("%d\n",numthreads);
 }
}

现在所有线程的
numthreads
值都相同。由于不同的线程正在将相同的值写入同一个变量,是否有可能该值被篡改?或者对原始数据类型的此操作保证是原子的

根据标准,这是不安全的:

可以使用多个加载或存储指令实现对变量的单一访问,以及 因此,对于同一变量的其他访问,不保证是原子的。 [...] 如果多个线程不同步地写入同一内存单元,包括由于 原子性考虑如上所述,则会发生数据竞争。[…]如果发生数据竞争,则程序的结果未指定

我强烈推荐阅读。虽然它不是最容易阅读的,但它非常具体和清晰。比我在这里描述的要好得多


关于OpenMP中的共享变量,需要考虑两件事:访问的原子性和内存的临时视图。

在实践中,int应该是对齐的,并且应该是原子的。比赛条件可能会影响性能,即使它不应该导致错误,如果值不变。我也会非常惊讶地看到程序在实践中产生错误的结果。不过它是未指定的、实现定义的、不可移植的。@Zulan:谢谢。实际上,我从来没有得到过numthreads的“坏”值,但今天在写这篇文章时,一个疑问出现了,这个问题已经被解决了+1至tim18,用于提出性能问题。我一有时间就会阅读记忆模型。再次感谢你的努力。