与 C++11 相比,OpenMP 从内存操作的角度而不是变量的角度使用原子性。例如,这允许对在编译时存储在大小未知的向量中的整数使用原子读/写:
std::vector<int> v;
// non-atomic access (e.g., in a sequential region):
v.resize(n);
...
v.push_back(i);
...
// atomic access in a multi-threaded region:
#pragma omp atomic write // seq_cst
v[k] = ...;
#pragma omp atomic read // seq_cst
... = v[k];
在 C++11 中,这是不可能实现的。我们可以通过放松内存模型将原子变量作为非原子变量来访问,但我们不能调整原子元素向量的大小。
我知道 C++ 不允许通过原子内存操作访问非原子变量是有原因的。但我想知道,为什么这些原因也不适用于 OpenMP。
例如,在N4013中,据说“没有合理的方法可以将原子操作完全可移植地应用于未声明为原子的数据。” OpenMP 怎么可能保证这样的可移植性而 C++ 不能?