我正在计算 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/