OpenMP 中的共享变量

Gau*_*ena 3 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);
 }
}
Run Code Online (Sandbox Code Playgroud)

现在numthreads所有线程的值都相同。是否有可能因为不同的线程将相同的值写入相同的变量,该值可能会出现乱码/损坏?或者这个对原始数据类型的操作是否保证是原子的?

Zul*_*lan 5

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

对变量的单次访问可以通过多个加载或存储指令来实现,因此不保证相对于对同一变量的其他访问是原子的。[...] 如果多个线程在没有同步的情况下写入同一个内存单元,包括上述由于原子性考虑的情况,则会发生数据竞争。[...] 如果发生数据竞争,那么程序的结果是不确定的

我强烈建议阅读1.4.1 OpenMP 内存模型的结构。虽然它不是最简单的阅读,但它非常具体且非常清晰。比我在这里描述的要好得多。

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