Thread-Sicherheit von C ++ Maps

9

Hier geht es um die Thread-Sicherheit von std::map . Jetzt sind simultane Lesevorgänge Thread-sicher, Schreibvorgänge jedoch nicht. Meine Frage ist, dass, wenn ich jedes Mal ein einzigartiges Element zur Karte hinzufüge, das threadsicher ist?

  1. Also, für ein Beispiel, wenn ich eine Karte wie diese habe std:map<int, std::string> myMap und ich füge immer neue Schlüssel hinzu und modifiziere niemals den existierenden Schlüsselwert, wird das threadsicher sein?

  2. Was noch wichtiger ist, wird mir das zufälliges Laufzeitverhalten geben?

  3. Wird das Hinzufügen neuer Schlüssel auch als Änderung betrachtet? Wenn die Schlüssel beim Hinzufügen immer anders sind, sollte es nicht Thread-sicher sein, da es einen unabhängigen Teil des Speichers verändert?

Danke Shiv

    
shiv chawla 22.11.2011, 22:16
quelle

2 Antworten

15

1) Natürlich nicht

2) Ja, ich hoffe, Sie werden es beim Testen sehen, nicht später

3) Ja, ist es. Das neue Element wird an einer anderen Stelle hinzugefügt, aber viele Zeiger werden währenddessen geändert.

Die Karte wird in den meisten, wenn nicht allen Implementierungen von einer Art Baum implementiert. Wenn Sie ein neues Element in einen Baum einfügen, wird es durch Neuanordnung von Knoten durch Zurücksetzen von Zeigern geändert, um auf verschiedene Knoten zu zeigen. Es ist also nicht threadsicher

    
Armen Tsirunyan 22.11.2011, 22:19
quelle
1

nein, ja, ja. Sie müssen beim Ändern des Containers eine exklusive Sperre erhalten (einschließlich des Einsetzens neuer Schlüssel), obwohl Sie während der laufenden Änderung natürlich nicht gleichzeitig sicher lesen können.

edit: Ссылка könnte für Sie interessant sein.

    
Michael Krelin - hacker 22.11.2011 22:22
quelle

Tags und Links