从同一个向量的不同范围的多个线程调用std :: copy是否安全?

Mic*_*ael 9 c++ multithreading stl

float从多个线程计算s并将结果存储在非重叠范围内,vector<float>如下所示:

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

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

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

这是安全的做法吗?

Nat*_*ica 8

首先vector::reserve,实际上并不创建任何元素.它只是设置向量的容量.如果您需要元素,vector::resize或者只需要构造所需大小的向量.

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

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