我从多个线程计算float
并将结果存储在相同vector<float>
的非重叠范围内,如下所示:
在运行我使用vector::reserve
预先分配的任何线程之前。
在每个线程中,计算特定于线程的vector
结果,然后将其复制到目标容器中,如下所示:
vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex;
std::copy( localVector.begin(), localVector.end(), destination );
这是安全的做法吗?
答案 0 :(得分:8)
首先vector::reserve
实际上并没有创建任何元素。它只是设置向量的容量。如果你需要元素,你需要vector::resize
或者只需要构造所需大小的矢量。
其次,经验法则是如果你在线程之间有一个共享对象,并且其中至少有一个是编写器,则需要同步。因为在这种情况下&#34;对象&#34;是迭代器范围,它们不重叠你在这方面没问题。只要矢量大小没有改变,那么你应该没问题。
您可能遇到的一个问题是虚假分享。如果相同的高速缓存行包含不同线程正在使用的变量,则每次更新行中的变量时,必须重新同步这些高速缓存行。这可能会慢慢降低代码的性能。
答案 1 :(得分:2)
如果向量具有固定大小(并且它看起来像你的问题),并且范围不重叠,那么: