Apprendre à écrire correctement des programmes multithreads est extrêmement difficile et prend du temps.
La première étape est donc de remplacer l'implémentation par une implémentation qui n'utilise pas du tout de threads multiples.
Ensuite, remettez soigneusement le filtrage si, et seulement si, vous en découvrez un besoin réel, lorsque vous aurez trouvé des moyens sûrs très simples pour le faire. Une implémentation non threadée qui fonctionne de manière fiable est bien meilleure qu'une implémentation threadée cassée.
Lorsque vous êtes prêt à commencer, privilégiez les conceptions qui utilisent des files d'attente à sécurité thread pour transférer les éléments de travail entre les threads et veillez à ce que ces éléments de travail ne soient accessibles qu'à un seul thread à la fois.
Essayez d'éviter de vous contenter de pulvériser lock
autour de votre code dans l'espoir qu'il devienne thread-safe. Cela ne fonctionne pas. Finalement, deux chemins de code vont acquérir les mêmes verrous dans un ordre différent, et tout s'arrêtera (une fois toutes les deux semaines, sur le serveur d'un client). Ceci est particulièrement probable si vous combinez des threads avec des événements de déclenchement, et que vous maintenez le verrou pendant que vous déclenchez l'événement - le gestionnaire peut prendre un autre verrou, et maintenant vous avez une paire de verrous maintenus dans un ordre particulier. Que se passe-t-il s'ils sont retirés dans l'ordre inverse dans une autre situation ?
En bref, il s'agit d'un sujet tellement vaste et difficile que je pense qu'il est potentiellement trompeur de donner quelques conseils dans une réponse courte et de dire "Allez-y !". - Je suis sûr que ce n'est pas l'intention des nombreuses personnes érudites qui donnent des réponses ici, mais c'est l'impression que beaucoup retirent des conseils résumés.
Au lieu de cela, acheter ce livre .
En voici un résumé très bien formulé à partir de ce site :
Le multithreading s'accompagne également de inconvénients. Le plus important est qu'il peut conduire à des programmes beaucoup plus complexes programmes. Le fait d'avoir plusieurs threads ne ne crée pas de complexité en soi ; c'est l'interaction entre les threads qui crée la complexité. Ceci s'applique que l'interaction soit intentionnelle ou non intentionnelle, et peut entraîner de longs cycles de développement, ainsi qu'une susceptibilité permanente aux bogues intermittents bogues intermittents et non reproductibles. Pour cette raison, il est préférable de garder une telle interaction dans une conception multithread simple - ou de ne pas utiliser le multithreading du tout du tout - sauf si vous avez un penchant particulier penchant particulier pour la réécriture et le débogage !
Un résumé parfait de Stroustrup :
La manière traditionnelle de traiter la concurrence en laissant un groupe de threads dans un espace d'adressage unique et en utilisant des verrous pour essayer de de faire face aux courses de données et aux problèmes de coordination qui en résultent. est probablement la plus mauvaise possible en termes de correction et de compréhensibles.
2 votes
Pouvez-vous être un peu plus précis sur vos problèmes ?