我正在从多个线程计算float
,并将结果存储在相同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 大小不变,就可以了。
您可能会遇到的一个问题是虚假共享。如果同一缓存行包含不同线程正在使用的变量,则每次更新该行中的变量时,这些缓存行都必须重新同步。这会大大降低代码的性能。