Quelles leçons avez-vous tirées d'un projet qui a presque / échoué en raison d'un mauvais multithreading?
Parfois, le cadre impose un certain modèle de filetage qui rend les choses d'un ordre de grandeur plus difficiles à obtenir correctement.
Quant à moi, je n'ai pas encore récupéré du dernier échec et je pense qu'il vaut mieux pour moi de ne pas travailler sur tout ce qui a à voir avec le multithreading dans ce cadre.
J'ai trouvé que j'étais bon dans les problèmes de multithreading qui ont un simple fork / join, et où les données ne voyagent que dans une direction (alors que les signaux peuvent voyager dans une direction circulaire).
Je ne suis pas en mesure de gérer l'interface graphique dans laquelle certains travaux ne peuvent être effectués que sur un thread strictement sérialisé (le "thread principal") et d'autres travaux ne peuvent être effectués que sur n'importe quel thread mais le thread principal (les "threads de travail"), et où les données et les messages doivent voyager dans toutes les directions entre N composants (un graphique entièrement connecté).
Au moment où j'ai quitté ce projet pour un autre, il y avait des problèmes de blocage partout. J'ai entendu que 2-3 mois plus tard, plusieurs autres développeurs ont réussi à résoudre tous les problèmes de blocage, au point qu'il peut être expédié aux clients. Je n'ai jamais réussi à découvrir ce morceau de connaissances manquant qui me manque.
Quelque chose au sujet du projet: le nombre d'ID de message (valeurs entières qui décrivent la signification d'un événement qui peut être envoyé dans la file d'attente de messages d'un autre objet, quel que soit le filetage) atteint plusieurs milliers. Les chaînes uniques (messages utilisateur) se chiffrent également à environ un millier.
Ajoutée
La meilleure analogie que j'ai obtenue d'une autre équipe (sans rapport avec mes projets passés ou présents) était de "mettre les données dans une base de données". ("Base de données" se référant à la centralisation et aux mises à jour atomiques.) Dans une interface graphique qui est fragmentée en plusieurs vues s'exécutant toutes sur le même "thread principal" et tous les travaux lourds non GUI sont effectués dans des threads de travail individuels, les données de l'application doivent être stocké dans une seule plase qui agit comme une base de données et laisser la "base de données" gérer toutes les "mises à jour atomiques" impliquant des dépendances de données non triviales. Toutes les autres parties de l'interface graphique ne gèrent que le dessin d'écran et rien d'autre. Les parties de l'interface utilisateur peuvent mettre en cache des éléments et l'utilisateur ne remarquera pas s'il est périmé d'une fraction de seconde, s'il est correctement conçu. Cette "base de données" est également connue comme "le document" dans l'architecture Document-View. Malheureusement - non, mon application stocke toutes les données dans les vues. Je ne sais pas pourquoi c'était comme ça.
Collègues contributeurs:
(les contributeurs n'ont pas besoin d'utiliser des exemples réels / personnels. Les leçons tirées d'exemples anecdotiques, si vous les jugez crédibles, sont également les bienvenues.)