![](/img/trans.png)
[英]Is calling wait() on a std::future multiple times and from multiple threads safe?
[英]Is calling std::copy from multiple threads for different ranges of the same vector safe?
我從多個線程計算float
並將結果存儲在相同vector<float>
非重疊范圍內,如下所示:
在運行我使用vector::reserve
預先分配的任何線程之前。
在每個線程中,計算特定於線程的結果vector
,然后將其復制到目標容器中,如下所示:
vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex;
std::copy( localVector.begin(), localVector.end(), destination );
這是安全的做法嗎?
第一個vector::reserve
實際上並不創建任何元素。 它只是設置向量的容量。 如果你需要元素,你需要vector::resize
或者只需要構造所需大小的向量。
其次,經驗法則是如果線程之間有共享對象,並且其中至少有一個是編寫器,則需要同步。 因為在這種情況下,“對象”是迭代器范圍並且它們沒有重疊,所以在這方面你是可以的。 只要矢量大小沒有改變,那么你應該沒問題。
您可能遇到的一個問題是虛假共享。 如果相同的高速緩存行包含不同線程正在使用的變量,則每次更新行中的變量時,必須重新同步這些高速緩存行。 這可能會慢慢降低代碼的性能。
如果向量具有固定大小(並且它似乎與您的問題有關),並且范圍不重疊,則:
因此我在這里看不到任何數據比賽。 (但根據你的問題的第一條評論,你必須確保,當使用它時,該向量具有這個固定的大小)。 您還可以看到std :: copy的“Data Races”部分: http : //www.cplusplus.com/reference/algorithm/copy/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.