我在 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) 在性能方面?我更喜欢使用 std::vector,因为我对 C 风格的数组不太满意。
编辑:我删除了#pragma omp atomic update
保护写入。