Stackoverflowで、STL コンテナーはどれも書き込みに対してスレッドセーフではないことを読みました。しかし、それは実際には何を意味するのでしょうか? 書き込み可能なデータをプレーン配列に格納する必要があるということですか?
ベクトルのサイズ変更が必要になる可能性があるため、同時呼び出しによりstd::vector::push_back(element)
データ構造の一貫性が失われる可能性があると思います。しかし、サイズ変更が含まれていない次のような場合はどうでしょうか。
- 配列の使用:
int data[n];
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
- `std::vector` を使用:
std::vector<int> data;
data.resize(n);
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
最初の実装は、a) スレッドセーフの点で、および b) パフォーマンスの点で、2 番目の実装よりも本当に優れていますか? 私は C スタイルの配列に慣れていないので、std::vector を使用したいと思います。
編集:#pragma omp atomic update
書き込みの保護を削除しました。