【发布时间】:2012-12-19 15:27:57
【问题描述】:
我读过on 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。
【问题讨论】:
-
我不确定是否可以将其作为答案,但我很确定写入
std::vector的不同元素是线程安全的。 -
这两个sn-ps同样是线程安全的。
-
“但这在实践中意味着什么?” :这意味着如果任何/任一操作与并发写入同时发生,则容器必须专门为写入和读取而锁定。您可以让所有读者敲打您想要的容器,但是一旦引入写入 potential,所有赌注都关闭,您必须锁定 all 访问(不是只是其他作家)。顺便说一句,单写多读锁适用于此。
标签: c++ stl thread-safety openmp