Les threads STL Map ou HashMaps sont-ils sûrs?

Puis-je utiliser une carte ou une hashmap dans un programme multithread sans avoir besoin d’un verrou? c’est-à-dire sont-ils en sécurité?

Je veux potentiellement append et supprimer de la carte en même temps.

Il semble y avoir beaucoup d’informations contradictoires.

En passant, j’utilise la bibliothèque STL fournie avec GCC sous Ubuntu 10.04.

EDIT: Tout comme le rest de l’Internet, il semble que je reçois des réponses contradictoires?

Vous pouvez effectuer en toute sécurité des opérations de lecture simultanées, c’est-à-dire appeler des fonctions membres const. Mais vous ne pouvez pas effectuer d’opérations simultanées si l’une d’elles implique l’écriture, c’est-à-dire que l’appel de fonctions membres non const doit être unique pour le conteneur et ne peut être mélangé à aucun autre appel.

c’est-à-dire que vous ne pouvez pas changer le conteneur à partir de plusieurs threads. Vous devez donc utiliser lock / rw-lock pour sécuriser l’access.

Non.

Honnête. Non.

modifier

Ok, je vais le qualifier.

Vous pouvez avoir n’importe quel nombre de threads lisant la même carte. Cela a du sens car le lire n’a pas d’effets secondaires, il n’est donc pas important que d’autres le fassent également.

Cependant, si vous voulez y écrire, vous devez obtenir un access exclusif, ce qui signifie d’empêcher tout autre thread d’écrire ou de lire jusqu’à ce que vous ayez terminé.

Votre question initiale concernait l’ajout et la suppression en parallèle. S’agissant de deux écritures, la réponse à la question de savoir si elles sont sécurisées pour les threads est un “non” simple et sans ambiguïté.

TBB est une bibliothèque open source gratuite qui fournit des conteneurs associatifs sécurisés pour les threads. ( http://www.threadingbuildingblocks.org/ )

Le modèle le plus couramment utilisé pour la sécurité du filetage des conteneurs STL est celui de SGI :

L’implémentation SGL de STL est thread-safe uniquement dans la mesure où les access simultanés à des conteneurs distincts sont sécurisés et les access en lecture simultanés aux conteneurs partagés sont sécurisés.

mais au final, c’est aux auteurs de la bibliothèque STL – AFAIK, la norme ne dit rien sur la sécurité du thread de STL.

Mais selon les docs, l’implémentation stdc ++ de GNU la suit (à partir de gcc 3.0+), si plusieurs conditions sont remplies.

HIH

La réponse (comme la plupart des problèmes de threading) est que cela fonctionnera la plupart du temps. Malheureusement, si vous attrapez la carte pendant qu’elle redimensionne, vous allez avoir des problèmes. Donc non.

Pour obtenir les meilleures performances, vous aurez besoin d’un verrou à plusieurs niveaux. Premièrement, un verrou de lecture qui autorise les accesseurs qui ne peuvent pas modifier la carte et qui peuvent être tenus par plusieurs threads (plusieurs éléments de lecture de threads sont acceptés). Deuxièmement, un verrou en écriture exclusif qui permet la modification de la carte de manière potentiellement dangereuse (ajout, suppression, etc.).

edit Les lockings Reader-writer sont bons, mais s’ils sont meilleurs que le mutex standard, cela dépend du modèle d’utilisation. Je ne peux pas recommander non plus sans en savoir plus. Profilez les deux et voyez ce qui correspond le mieux à vos besoins.