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.
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
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