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

时间:2016-02-08 19:45:54

标签: c++ multithreading stl

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

在运行我使用vector::reserve预先分配的任何线程之前。

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

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

这是安全的做法吗?

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:2)

如果向量具有固定大小(并且它看起来像你的问题),并且范围不重叠,那么:

  1. 矢量无法重新分配
  2. 不同的线程无法访问相同的内存
  3. 因此,我在这里看不到任何数据比赛。 (但根据您对问题的第一条评论,您必须确保,该向量在使用时具有此固定大小)。您还可以看到&#34; Data Races&#34; std :: copy的部分:http://www.cplusplus.com/reference/algorithm/copy/