Thread-Sicherheit von std :: map für schreibgeschützte Operationen
Habe ich eine std::map, die ich verwenden, um die anzeigen-Werte (Feld ID) in eine lesbare Zeichenfolge. Diese Karte ist initialisiert, sobald, wenn mein Programm gestartet wird, bevor alle anderen threads werden gestartet, und nach, dass es nie wieder geändert. Jetzt gebe ich jeder thread seine eigene Kopie dieser (relativ große) map aber das ist offensichtlich ineffiziente Nutzung von Speicher und verlangsamt den Programmstart. Also dachte ich mir, jedem thread einen Zeiger auf die Karte, aber das wirft eine thread-Frage der Sicherheit.
Wenn alles, was ich Tue, ist das Lesen von der Karte mit dem folgenden code:
std::string name;
//here N is the field id for which I want the human readable name
unsigned field_id = N;
std::map<unsigned,std::string>::const_iterator map_it;
//fields_p is a const std::map<unsigned, std::string>* to the map concerned.
//multiple threads will share this.
map_it = fields_p->find(field_id);
if (map_it != fields_p->end())
{
name = map_it->second;
}
else
{
name = "";
}
Wird das funktionieren oder gibt es da Probleme mit dem Lesen einer std::map aus mehreren threads?
Hinweis: ich arbeite mit visual studio 2008 aktuell, aber ich möchte diese Arbeit acros wichtigste STL-Implementierungen.
Update: Bearbeitet-code-Beispiel für const-Korrektheit.
InformationsquelleAutor der Frage jilles de wit | 2009-12-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese arbeiten werden von mehreren threads, wie lange Ihre Karte bleibt die gleiche. Die Karte, die Sie verwenden unveränderlich ist de facto also jeder finden wird, tatsächlich eine finden, in einer Karte, die ändert sich nicht.
Hier ist ein einschlägiger link: http://www.sgi.com/tech/stl/thread_safety.html
Fallen Sie in er "gleichzeitige lese-Zugriffe auf freigegebene Container" - Kategorie.
Hinweis: dies gilt für die SGI-Implementierung. Sie brauchen, um zu überprüfen, ob Sie eine weitere Umsetzung. Die beiden Implementierungen, die scheinbar weit verbreitet als alternative, STLPort gebaut hat-in thread-Sicherheit, wie ich weiß. Ich weiß nicht, über die Apache-Implementierung obwohl.
InformationsquelleAutor der Antwort laura
Sollte es in Ordnung sein.
Sie können
const
Verweise auf Sie, wenn Sie möchten, um Dokument/erzwingen von nur-lese-Verhalten.Beachten Sie, dass die Richtigkeit nicht garantiert (im Prinzip die Karte können wählen, um auszugleichen, sich selbst auf einen Anruf auf
find
), auch wenn Sie const-Methoden nur (eine wirklich perverse Umsetzung könnte erklären, die Struktur veränderlich). Dies scheint jedoch sehr unwahrscheinlich in der Praxis.InformationsquelleAutor der Antwort Useless
Ja, es ist.
Siehe entsprechenden post mit der gleichen Frage zu std::set:
Ist die C++ - std::set thread-safe?
InformationsquelleAutor der Antwort RED SOFT ADAIR