2016-11-30 2 views
0

J'ai deux fils:threadsafety vs validité Iterator

  • Enfilez une insertion dans un std::map
  • fil B suppression d'un std::map

Depuis std::map::erase et std::map::insert garder tous les itérateurs de la carte en cours de validité , Je ne semble pas comprendre comment une condition de concurrence pourrait se produire dans ce scénario.

+0

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

+0

É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

Répondre

2

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.