J'élargis mes commentaires en une réponse parce que je pense que certains aspects du problème spécifique sont soit négligés, soit utilisés pour tirer des conclusions erronées.
À ce stade, la question de savoir s'il faut ou non refactoriser est prématurée (même si une forme spécifique de «oui» y répondra probablement).
Le problème central ici est que (comme indiqué dans certaines réponses) les commentaires que vous citez indiquent fortement que le code a des conditions de concurrence ou d'autres problèmes de simultanéité / synchronisation, tels que discutés ici . Ce sont des problèmes particulièrement difficiles, pour plusieurs raisons. Premièrement, comme vous l'avez constaté, des modifications apparemment non liées peuvent déclencher le problème (d'autres bogues peuvent également avoir cet effet, mais les erreurs de concurrence le sont presque toujours.) Deuxièmement, elles sont très difficiles à diagnostiquer: le bogue se manifeste souvent à un endroit éloigné dans le temps ou le code de la cause, et tout ce que vous faites pour la diagnostiquer peut la faire disparaître ( Heisenbugs). Troisièmement, les bogues d'accès simultané sont très difficiles à trouver dans les tests. Cela est dû en partie à l'explosion combinatoire: c'est assez mauvais pour un code séquentiel, mais l'ajout des interconnexions possibles d'une exécution simultanée le fait exploser au point que le problème séquentiel devient insignifiant en comparaison. De plus, même un bon cas de test ne peut occasionnellement déclencher le problème - Nancy Leveson a calculé que l'un des insectes mortels du Therac 25s'est produite dans 1 des 350 passages environ, mais si vous ne savez pas quel est le bogue, ni même s'il en existe un, vous ne savez pas combien de répétitions font un test efficace. En outre, seuls les tests automatisés sont réalisables à cette échelle et il est possible que le pilote de test impose des contraintes de minutage subtiles de sorte qu'il ne déclenche jamais le bogue (Heisenbugs à nouveau).
Il existe certains outils de test de concurrence dans certains environnements, tels que Helgrind pour le code utilisant des pthreads POSIX, mais nous ne connaissons pas les détails ici. Les tests doivent être complétés par une analyse statique (ou est-ce l'inverse?), S'il existe des outils adaptés à votre environnement.
Pour ajouter à la difficulté, les compilateurs (et même les processeurs, au moment de l'exécution) sont souvent libres de réorganiser le code de manière à rendre le raisonnement sur la sécurité des threads très contre-intuitif (le cas le plus connu est peut-être le double contrôle). verrouiller l' idiome, bien que certains environnements (Java, C ++ ...) aient été modifiés pour l'améliorer.)
Ce code peut avoir un problème simple qui est la cause de tous les symptômes, mais il est plus probable que vous ayez un problème systémique susceptible d'empêcher vos projets d'ajouter de nouvelles fonctionnalités. J'espère vous avoir convaincu que vous pourriez avoir un problème sérieux, peut-être même une menace existentielle pour votre produit, et la première chose à faire est de savoir ce qui se passe. Si cela révèle des problèmes de simultanéité, je vous conseille vivement de les résoudre avant de vous poser la question de savoir si vous devez effectuer une refactorisation plus générale et avant d'essayer d'ajouter d'autres fonctionnalités.