我读过on Stackoverflow没有一个STL容器对于编写是线程安全的。但是这在实践中意味着什么?这是否意味着我应该在普通数组中存储可写数据?写std :: vector vs plain数组的线程安全
我预计并发调用std::vector::push_back(element)
可能会导致不一致的数据结构,因为它可能需要调整向量的大小。但关于像这样的情况下,当调整大小不涉及什么:)使用阵列
1:使用`的std :: vector``
int data[n];
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
2):
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);
}
在线程安全性和b)性能方面,第一个实现是否比第二个实现更好?我宁愿使用std :: vector,因为我对C风格的数组不太舒服。
编辑:我删除了#pragma omp atomic update
保护写。
我不能确定它是否成为答案,但我很确定写入'std :: vector'的不同元素是线程安全的。 – Angew
这两个片段同样是线程安全的。 –
“但这在实践中意味着什么?” :这意味着一个容器必须专门锁定写入*和*读取,如果任何/任一操作符合并发**写入**。您可以让所有读者在您想要的容器上敲击,但只要写入*潜力*被引入,所有投注都将关闭,您必须锁定*所有*存取权限(而不仅仅是其他作者)。顺便说一句,单写多读锁适用于此。 – WhozCraig