2009-05-11 5 views

Répondre

4

Il y a quelques façons.

Le meilleur moyen consiste à éliminer toutes les données partagées entre les threads. Bien que ce ne soit pas toujours pratique, il est toujours bon d'éliminer autant de données partagées que possible. Après cela, vous devez commencer à vous intéresser à la programmation sans verrou. La programmation sans clé est un peu la mode en ce moment, mais le secret est que c'est souvent une bien meilleure idée d'utiliser la concurrence basée sur les verrous comme les mutex et les sémaphores. La programmation sans clé est très difficile à obtenir correctement. Recherchez les articles de Herb Sutter sur le sujet, ou la page wikipedia. Il y a beaucoup de bonnes ressources sur la synchronisation sans clé.

Quelque part entre les sections critiques. Si vous programmez sur Windows, les sections critiques devraient être préférées aux mutex car elles font un peu de travail pour éviter la surcharge des verrous de mutex et des déverrouillages complets. Essayez-les d'abord, et si vos performances sont inacceptables (ou si vous ciblez des plates-formes sans sections critiques), vous pouvez vous pencher sur des techniques sans clé.

1

Assurez-vous de passe sur structures de données entre les threads, toujours savoir quel fil les données exclusivement appartient. Si vous utilisez (comme mentionné par Dan avant) e.q. files d'attente sans clé pour transmettre vos données, vous ne devriez pas rencontrer trop de problèmes de concurrence (car votre code se comporte beaucoup plus comme n'importe quel autre code qui attend l'arrivée de certaines données).

Toutefois, si vous migrez du code single-to-multithread, il s'agit d'une bête totalement différente. C'est très difficile. Et la plupart du temps il n'y a pas de solutions élégantes.