2017-06-19 3 views
0

Ich möchte eine unordered_map mit gleichzeitigem Zugriff von einem Schreiber und mehreren Lese-Threads erstellen. Der Autor wird nur ein Paar einfügen, nicht entfernen oder aktualisieren eingefügt. Ist das ein Thread sicher? Kann ich die Einfügeoperation als atomare Operation betrachten? Ich habe mehrere Tests mit meinem Code durchgeführt, keine Abstürze oder falsche Ergebnisse gefunden.C++: Ein Writer/Multi-Reader Zugriff auf eine ungeordnete_map thread sicher?

Thx!

+0

Nein, es ist nicht sicher. Sie benötigen eine Art Sperre, um zu verhindern, dass ein Schreiber und ein Leser gleichzeitig auf die Karte zugreifen. Und keine Operationen auf Standardbibliothekscontainern sind atomar. –

Antwort

3

Nein, das ist nicht threadsicher. Sie müssen sicherstellen, dass niemand die unoredered_map liest, während Sie es ändern. Wenn zum Beispiel die Karte aufgrund einer insert regeneriert werden muss, könnten Sie versuchen, Daten zu lesen, die geändert werden, obwohl es ein anderes Element ist.

Die Regel dafür lautet: Wenn Sie Daten freigegeben haben, auf die mehrere Threads zugreifen und von denen mindestens einer ein Writer ist, müssen Sie eine Synchronisierung durchführen.


Dies bedeutet nicht, dass Sie alle Ihre Leser während des Lesens blockieren müssen. Sie können eine std::shared_mutex verwenden, um mehrere Leser gleichzeitig lesen zu lassen, aber es wird alle Leser blockieren, wenn der Schreiber schreiben muss.

1

Wenn Sie über Standard-unordered_map, nach C++ - Standard sprechen: Jeder Lesezugriff auf STL-Sammlung ist Thread-sicher. Die Schreiboperation ist nicht Thread-sicher. Wenn Sie Lese- und Schreiboperationen mischen, ist es auch nicht threadsicher.