2016-11-30 2 views
0

Ich habe zwei Themen:threadsafety vs Iterator Gültigkeit

  • Gewinde A Einfügen in einen B std::map
  • Thema von einem std::map

Da std::map::erase und std::map::insert halten die Beseitigung aller Iteratoren der Karte gültig Ich verstehe nicht, wie eine Race-Bedingung in diesem Szenario auftreten könnte.

+0

Es kann interner Zustand der Karte, die beiden Anrufe zu tun bis zur gleichen Zeit versaut werden. "Größe" kommt mir in den Sinn. – NathanOliver

+0

Da nur const Funktionen in der aktuellen C++ Standard erforderlich sind Thread-sicher zu sein, und std :: map ist nicht erforderlich, Thread-sicher sein, warum sollte man nicht eine Race-Bedingung erwarten, wenn nicht konstante Funktionen aufrufen? – UKMonkey

Antwort

2

Kommentare sagen, das Richtige sind. Ich werde sie mit Ihrer Aussage kombinieren:

std::map::erase und std::map::insert halten alle Iteratoren der Karte gültig nur dann, wenn sie der Reihe nach ausgeführt werden.

Wenn sie parallel ausgeführt werden, ein Faden (wenn es seine Arbeit beginnt) eine teilweise modifizierte Objektseite (der andere Thread daran arbeitet). Das Ergebnis der Aktion für ein teilweise modifiziertes Objekt ist nicht definiert. Dies ist die Ursache des Problems.

Wenn Sie Zugriff auf Ihr Objekt synchronisieren mit sagen mutex alles gut funktioniert. Container haben keine eingebaute Synchronisation, da dies ihre Arbeit erheblich verlangsamen würde, während dies nur manchmal benötigt wird.