Un accès en lecture, qui écrit.

Posted on Aug 16, 2009

Dans un projet C++ récent, j'ai utilisé le conteneur associatif map, et plus précisément le type map<int,int> qui associe un entier machine à un entier machine. Lorsqu'on adresse une clef qui n'existe pas dans un dict python (en gros l'équivalent du map C++), on obtient une erreur. En C++ on obtient la valeur par défaut du type valeur, à savoir 0 pour un entier. Et j'ai utilisé cette fonctionnalité dans mon projet parce que justemment, la valeur par défaut était 0 et je n'allais pas remplir explicitement tous ces 0.

Tout fonctionnait à merveille jusqu'à l'utilisation de thread pour paralléliser mon programme, et alors là rien ne va plus. J'ai finalement compris que l'erreur venait de l'adressage de la map avec des clefs inexistantes : dans ce cas là, l'implémentation de la STL que j'utilisais renvoie 0, certes, mais ajoute aussi ce couple (clé, valeur) explicitement (ce qui constitue une modification de la structure de données, et donc doit être protégé lors d'une programmation parallèle).

Moralité : parfois, il vaut mieux perdre un peu de temps à ajouter du code en apparence inutile (l'ajout des 0 explicites) pour garder un code robuste en exécution parallèle.