Les commentaires disent la bonne chose. Je les combiner avec votre déclaration:
std::map::erase
et std::map::insert
garder tous les itérateurs de la carte valide que si elles sont exécutées séquentiellement.
Si elles sont exécutées en parallèle, un thread (lorsqu'il commence son travail) peut faire face à un objet partiellement modifié (l'autre thread travaille dessus). Le résultat de l'action sur un objet partiellement modifié est indéfini. C'est la source du problème.
Si vous synchronisez l'accès à votre objet avec mutex
par exemple, tout fonctionnera correctement. Les conteneurs n'ont pas de synchronisation intégrée car cela ralentirait considérablement leur travail alors que cela n'est parfois nécessaire.
Il se peut que l'état interne de la carte soit corrompu en faisant les deux appels en même temps. "taille" vient à l'esprit. – NathanOliver
Étant donné que seules les fonctions const de la dernière norme C++ doivent être thread-safe et que std :: map n'est pas nécessairement thread-safe, pourquoi ne pas s'attendre à une condition de concurrence lors de l'appel de fonctions non-const? – UKMonkey