Ruft std :: copy aus mehreren Threads für verschiedene Bereiche des gleichen Vektors sicher?

8

Ich berechne float s aus mehreren Threads und speichere die Ergebnisse in nicht überlappenden Bereichen derselben vector<float> wie folgt:

Bevor ich einen der Threads ausgeführt habe, habe ich ihn vorher mit vector::reserve zugewiesen.

In jedem Thread wird ein threadspezifisches vector der Ergebnisse berechnet und dann wie folgt in den Zielcontainer kopiert:

%Vor%

Ist das eine sichere Übung?

    
Michael 08.02.2016, 19:45
quelle

2 Antworten

7

Erstes vector::reserve erzeugt keine Elemente. Es legt nur die Kapazität des Vektors fest. Wenn Sie die Elemente benötigen, benötigen Sie vector::resize oder konstruieren Sie einfach den Vektor auf die benötigte Größe.

Zweitens lautet die Faustregel, wenn Sie ein gemeinsames Objekt zwischen Threads haben und mindestens einer von ihnen ein Schreiber ist, müssen Sie synchronisieren. Da in diesem Fall das "Objekt" der Iteratorbereich ist und sich nicht überschneidet, sind Sie in dieser Hinsicht in Ordnung. Solange die Größe der Vektoren nicht geändert wird, sollten Sie in Ordnung sein.

Ein Problem, das Sie damit haben könnten, ist falsches Teilen. Wenn dieselbe Cachezeile Variablen enthält, die von verschiedenen Threads verwendet werden, müssen diese Cachezeilen jedes Mal neu synchronisiert werden, wenn eine Variable in der Zeile aktualisiert wird. Dies kann die Leistung des Codes erheblich verlangsamen.

    
NathanOliver 08.02.2016, 19:55
quelle
2

Wenn der Vektor eine feste Größe hat (und es scheint, als ob er von Ihrer Frage stammt) und Bereiche sich nicht überschneiden, dann:

  1. vector wird nicht neu zugewiesen
  2. verschiedene Threads greifen nicht auf den gleichen Speicher zu

Ich sehe hier also keine Datenrennen. (Aber nach dem ersten Kommentar zu Ihrer Frage müssen Sie sicherstellen, dass der Vektor diese feste Größe hat, wenn er verwendet wird). Sie können auch den Abschnitt "Datenrennen" für std :: copy: Ссылка

sehen     
Piotr Smaroń 08.02.2016 19:54
quelle

Tags und Links