Ich habe eine Karte wie diesestd :: Kartenlesen, während in einem separaten Thread Einfügen
map<string,A>
Nun, wenn ich durch die Karte von Thread Ich bin Iterieren, Faden II auf, um es etwas einfügen. Beeinflusst diese Insertion das Lesen?
Ich habe eine Karte wie diesestd :: Kartenlesen, während in einem separaten Thread Einfügen
map<string,A>
Nun, wenn ich durch die Karte von Thread Ich bin Iterieren, Faden II auf, um es etwas einfügen. Beeinflusst diese Insertion das Lesen?
Ja, der Einsatz kann den Messwert beeinflussen. Der Standard bietet keine Garantie für die Gewindel sicherheit. Es gibt eine Race Condition, die zu undefiniertem Verhalten führt.
Eine Wettlaufbedingung ** immer ** führt zu undefiniertem Verhalten. –
Wie wirkt sich das Einfügen auf das Lesen aus? Pro [this] (http://stackoverflow.com/a/6442829/4342498) Einfügung betrifft kein anderes Element. – NathanOliver
@NathanOliver Obwohl die Antwort dies nicht explizit sagt, beschreibt sie die * post-Bedingungen * der Operationen. Technisch gesehen gelten Post-Bedingungen erst, wenn die Operation zurückgegeben wurde. Das Problem ist nicht nur die Gültigkeit von Referenzen. Die "Karte" kann während des Einfügens in einem inkonsistenten Zustand sein. – user2079303
Ja, es wird den Messwert beeinflussen. Sie benötigen einen zusätzlichen Synchronisationsmechanismus zwischen diesen beiden Threads. Lesen Sie über std::mutex
und std::unique_lock
.
Siehe folgende Beispielcode:
#include <map>
#include <string>
#include <mutex>
#include <memory>
class MapWithMutex
{
public:
int readFromMap(const std::string& key)
{
std::unique_lock<std::mutex>(mtx);
//add some check if elements exists
return myMap[key];
}
void insertToMap(const std::string& key, int value)
{
//add check if element doesn't already exist
std::unique_lock<std::mutex>(mtx);
myMap[key] = value;
}
private:
std::map<std::string,int> myMap;
std::mutex mtx;
};
int main() {
MapWithMutex thSafeMap;
//pass thSafeMap object to threads
return 0;
}
Denken Sie daran, kritischen Abschnitt so klein wie möglich
Ja zu machen. In einem Wort. Sie könnten mit einer std :: list durchkommen, weil das Einfügen die Iteratoren nicht ungültig macht, aber ich sehe immer noch eine Chance für Probleme. Thread-sichere Warteschlangen suchen? – doctorlove
@doctorlove std :: map macht keine Iteratoren mehr ungültig als std :: list. Keine von ihnen sind Thread-sicher. – user2079303