Kann ich eine thread-sichere std::atomic<vector<int>>?
Ich habe eine Funktion, die ausgeführt werden muss n=1000
Zeiten. Diese Funktionen hat ein Stil von Monte Carlo simulation und gibt einen int
als das Ergebnis. Ich würde gerne nthreads=4
parallel. Immer wenn ein thread abgeschlossen ist ein Zyklus, es sollte das Ergebnis in eine std::vector<int>
.
So, nach 1000 Zyklen, ich habe einen vector von 1000 int
s, die untersucht werden kann, indem Statistiken.
Da ein std::vector
ist nicht thread-sicher, dachte ich über std::mutex
(die würden sicherlich funktionieren).
Aber ich Frage mich, ob ich das deklarieren einer vector-atomar sind und damit umgehen Mutexe?
Ist es möglich, ein std::atomic<std::vector<int>>
? Und kann ich push_back
etc. auf es?
- Hast std::atomic<std::vector<int>> kompiliert?
- Ich kann nicht versuchen, auf diese Maschine... aber kam gerade über atomic.
- Ich wollte nur hinzufügen, dass wenn Sie von Anfang an wissen, dass Sie 1000 Hinrichtungen und der container store genau 1000 ergibt sich dann, warum Sie verwenden möchten, dynamischen container? Ich weiß, dass std::vector verwendet array in der Umsetzung und keine Umverteilung erforderlich sein werden, wenn Sie reservieren Sie genügend Speicherplatz am Anfang (also es werden keine Leistungssteigerung durch Verwendung von std::array).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht. Es ist völlig okay, um Zugang ja
std::vector
von mehreren threads, wennSo stellen Sie einfach sicher, erstellen Sie einen Vektor der Größe
n=1000
und je nach thread-Anzahl (1 bis 4) ordnen Sie Elemente 0-249, 250-499 etc. auf deine threads.So dass jeder thread berechnet
n/nthreads
Elemente.int
sind atomic auf allen Architekturen, es sei denn, Sie verwendenatomic_int
oderstd::atomic<int>
.C++11 §29.5/1 sagt
Was nicht trivial kopierbaren bedeuten?
§3.9 erzählt
Klasse-Typen (von denen
std::vector
ist):Laut dieser Liste
std::vector
ist nicht trivial kopierbaren und so kann man nicht mitstd::atomic<std::vector<int>>
.Da Sie wissen, die Größe im Voraus, und da brauchen Sie nicht zu verwenden Methoden, die erfordern würde, dass der Vektor zugewiesen werden, in einen anderen Speicherort (wie
push_back)
. Sie könnenstd::vector<int>::resize
oder die Größe Konstruktor preallocate und preconstruct die erforderlichenint
s. Daher ist Ihre gleichzeitige threads müssen nicht für den Betrieb auf den Vektor selbst, sondern auf die Elemente.Wenn es keinen Zugriff aus verschiedenen threads auf das selbe element es gibt keine race-condition.
Das gleiche gilt für
int k[1000]
ist trivial kopierbar. Aber Sie brauchen es nicht zu sein, da die threads nicht ändern, array/vector/Liste selbst, sondern die Elemente.Atomic instanziiert werden kann mit trivial kopierbaren Arten. Vector ist nicht so ein Typ.
int k[1000]
eine "trivial kopierbaren Typs"?k
nur einen Zeiger. Zeiger sind trivial kopierbar. Aber ich weiß nicht, ob dieses als eine Tabelle werden threadsicher alsk
ist ein normaler Zeiger, aberk[5]
kann geschrieben werden als*(k+5)
undk+5
ist eine andere Zeiger, aber ich bin nicht sicher, ob es wirklich. Sie können überprüfenis_trivially_copyable
ausstd
. Würden Sie normalerweise schreiben Sie Ihre eigenenthreadsafe_vector
Typ für threadsicher Container.