mercredi 20 août 2008

Être ou ne pas être thread safe

Je codais il y a de cela quelques jours une petite interface pour visualiser nos queues de messages. En programmeur soucieux de la réactivité de mon interface graphique, je me décidais de placer chaque connexion vers chaque queue dans son propre thread.

O tempora, O mores, que n'avais-je pas fait là! Après quelques minutes de tests, des crash intempestifs sont venus me rappeler que les threads ne pardonnent pas l'à-peu-près. En plongeant dans le débuggeur, je n'ai pas tardé à trouver que chaque connexion, apparemment indépendante de ses copines, se retrouvait de fait référencée dans une obscure map au fin fond d'un singleton (argh!), et que cela me mettait dedans.

En effet, la libraire d'accès aux queues, en C, avait été gentiment wrappée en C++, ce qui est bien, mais avec de discutables (et impossibles à désactiver) optimisations qui partagent la connexion sous-jacente, ce qui est moins bien. Kaboum, donc.

Je suis donc revenu à un design bâtard, où les connexions sont toutes dans le même thread, séparé du thread principal de l'interface. C'est donc moche, et vachement moins efficace. Grrr!

Aucun commentaire: