簡體   English   中英

從同一個向量的不同范圍的多個線程調用std :: copy是否安全?

[英]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或者只需要構造所需大小的向量。

其次,經驗法則是如果線程之間有共享對象,並且其中至少有一個是編寫器,則需要同步。 因為在這種情況下,“對象”是迭代器范圍並且它們沒有重疊,所以在這方面你是可以的。 只要矢量大小沒有改變,那么你應該沒問題。

您可能遇到的一個問題是虛假共享。 如果相同的高速緩存行包含不同線程正在使用的變量,則每次更新行中的變量時,必須重新同步這些高速緩存行。 這可能會慢慢降低代碼的性能。

如果向量具有固定大小(並且它似乎與您的問題有關),並且范圍不重疊,則:

  1. 矢量不會被重新分配
  2. 不同的線程不會訪問相同的內存

因此我在這里看不到任何數據比賽。 (但根據你的問題的第一條評論,你必須確保,當使用它時,該向量具有這個固定的大小)。 您還可以看到std :: copy的“Data Races”部分: http//www.cplusplus.com/reference/algorithm/copy/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM