c++ - 从多个线程为同一 vector 的不同范围调用 std::copy 是否安全?

标签 c++ multithreading stl

我正在计算 float来自多个线程的 s 并将结果存储在相同 vector<float> 的非重叠范围内如下:

在运行任何线程之前,我使用 vector::reserve 预先分配它.

在每个线程中一个线程特定的vector计算结果然后将其复制到目标容器中,如下所示:

vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex;
std::copy( localVector.begin(), localVector.end(), destination );

这种做法安全吗?

最佳答案

首先 vector::reserve 实际上并不创建任何元素。它只是设置 vector 的容量。如果您需要元素在那里,您需要 vector::resize 或仅将 vector 构建为所需的大小。

其次,经验法则是,如果您在线程之间有一个共享对象,并且其中至少一个是您需要同步的编写器。因为在这种情况下,“对象”是迭代器范围并且它们不重叠,所以在这方面你没问题。只要 vector 大小没有改变,就应该没问题。

您可能遇到的一个问题是虚假共享。如果同一缓存行包含不同线程正在使用的变量,则每次更新行中的变量时,这些缓存行都必须重新同步。这会大大降低代码的性能。

关于c++ - 从多个线程为同一 vector 的不同范围调用 std::copy 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35277996/

相关文章:

c++ - 调用 vector.push_back() 时避免复制构造函数/析构函数

c++ - 具有 const 和 nonconst 成员的 union ?

python - WSGI:从应用程序返回的可迭代对象可以从不同的线程迭代吗?

c# - ConcurrentBag 的正确用法是什么?

c++ - 为什么 C++ STL vector 在做很多保留时会慢 1000 倍?

c++ - 带类的 SDL

c++ - 理解参数 "error: cannot convert ‘char**’ 到 ‘const char*’ 的错误 ‘1’ 到 ‘double atof(const char*)’“

ios - 从进入主队列后,UI 变得无响应

c++ - 具有可预测键的关联容器 : which one to use?

c++ - 在 switch 案例中实现函数调用的其他方式