Ich habe ein C++ 11 Programm, das einige Berechnungen durchführt und eine std::unordered_map
verwendet, um Ergebnisse dieser Berechnungen zwischenzuspeichern. Das Programm verwendet mehrere Threads und verwendet eine gemeinsame unordered_map
, um die Ergebnisse der Berechnungen zu speichern und zu teilen.Data Race mit std :: unordered_map, trotz Sperren Einfügungen mit Mutex
Basierend auf meiner Lektüre von unordered_map
und STL-Container-Spezifikationen sowie unordered_map thread safety, so scheint es, dass ein unordered_map
, von mehreren Threads gemeinsam genutzt, kann zu einem Zeitpunkt einen Thread Schreiben handhaben, aber viele Leser auf einmal.
Daher verwende ich eine std::mutex
um meine insert()
Aufrufe auf die Karte zu wickeln, so dass höchstens nur ein Thread auf einmal eingefügt wird.
Allerdings haben meine find()
Anrufe keinen Mutex als, aus meiner Lesung scheint es, dass viele Threads in der Lage sein sollten, auf einmal zu lesen. Allerdings bekomme ich gelegentlich Datenrennen (wie von TSAN entdeckt), die sich in einem SEGV manifestieren. Das Datenrennen weist eindeutig auf die oben erwähnten Aufrufe insert()
und find()
hin.
Wenn ich die find()
Anrufe in einen Mutex wickeln, verschwindet das Problem. Allerdings möchte ich die gleichzeitige Lesevorgänge nicht serialisieren, da ich versuche, dieses Programm so schnell wie möglich zu machen. (FYI: Ich laufe mit gcc 5.4.)
Warum passiert das? Ist mein Verständnis der Nebenbürgschaften von std::unordered_map
falsch?
Es klingt, als ob Sie einen 'shared_mutex' benötigen, da alle Schreib- und Leseaufrufe Synchronisation benötigen, da Sie einen Writer haben. – NathanOliver
Die Antwort im verknüpften Thread sagt es: "* A. Mehrere Threads gleichzeitig lesen, * ** oder ** * B. Ein Thread gleichzeitig schreiben *". Notiere die ** oder **. – Pixelchemist
Sie haben die Spezifikation falsch interpretiert; Es erlaubt mehrere Leser, aber nicht mehrere Leser unabhängig vom einzelnen Schreiber. Sie benötigen ein Multiple Reader/Single Writer Lock wie das shared_mutex in NathanOliver's Kommentar erwähnt – antlersoft