OpenMP は、C++11 とは対照的に、変数ではなくメモリ操作の観点から原子性を使用して動作します。これにより、たとえば、コンパイル時にサイズが不明なベクトルに格納されている整数に対してアトミックな読み取り/書き込みを使用できます。
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++ が保証できないというのはどうしてでしょうか?