我正在从多个线程计算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 大小不变,就可以了。

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

09-10 05:56
查看更多