dormir sur un événement

J’ai un programme multi-thread dans lequel je dors dans un seul thread (Thread A) sans condition et pour une durée infinie. Lorsqu’un événement se produit dans un autre thread (fil de discussion B), il active le thread de fil A en le signalant. Maintenant, je sais qu’il y a plusieurs façons de le faire. Lorsque mon programme s’exécute dans un environnement Windows, j’utilise WaitForSingleObject dans Thread-A et SetEvent dans le Thread-B. Cela fonctionne sans aucun problème. Je peux aussi utiliser un modèle basé sur un descripteur de fichier où je fais un sondage, une sélection. Il y a plus d’une façon de le faire. Cependant, j’essaie de trouver quel est le moyen le plus efficace. Je veux réactiver le Thread-A dès que possible. Que pensez-vous est la meilleure option. Je suis ok pour explorer une option basée sur le conducteur.

Merci

Comme dit, déclencher un SetEvent dans le thread B et un WaitForSingleObject dans le thread A est rapide. Cependant, certaines conditions doivent être sockets en compte:

  • Monocœur / processeur: comme le dit Martin, le thread en attente le devancera. Avec un tel schéma, vous devez veiller à ce que le fil de signalisation (B) soit inactif juste après SetEvent . Cela peut être fait par un sleep(0) par exemple.

  • Multi-cœur / processeur: on pourrait penser qu’il est avantageux de placer les deux threads sur différents cœurs / processeurs, mais ce n’est pas vraiment une bonne idée. Si les deux threads se trouvent sur le même cœur / processeur, le délai entre l’appel de SetEvent et le retour de WaitForSingleObject est beaucoup plus court.

  • Le traitement des deux threads sur un kernel ( SetThreadAffinityMask ) permet également de gérer leur comportement au moyen de leur priorité ( SetThreadPriority ). Vous pouvez exécuter le thread en attente à un niveau supérieur ou vous devez vous assurer que le thread de signalisation ne fait rien après avoir défini l’événement.

  • Vous devez faire face à un autre problème de synchronisation: quand aura lieu le prochain événement? Le fil A aura-t-il terminé sa tâche? Le plus efficacement possible, un deuxième événement peut être utilisé pour résoudre ce problème: lorsque le thread A est terminé, il définit un événement pour indiquer que le thread B est autorisé à définir à nouveau son événement. Le fil de discussion B définira d’abord l’événement, puis attendra l’événement de rétroaction; il répond au besoin de passer immédiatement au ralenti.

  • Si vous souhaitez autoriser le thread B à définir l’événement même lorsque le thread A n’est pas terminé et qu’il n’est pas encore dans un état d’attente, vous devez envisager d’utiliser des sémaphores au lieu d’événements. De cette manière, le nombre “d’appels / événements” du thread B est conservé et la fonction wait du thread A peut faire suite car elle renvoie le nombre de fois que le sémaphore a été libéré. Les objects sémaphore sont à peu près aussi rapides que les événements.

Résumé:

  • Avoir les deux threads sur le même core / cpu au moyen de SetThreadAffinityMask .

  • Étendez SetEvent / WaitForSingleObject par un autre événement pour établir une Handshake .

  • En fonction des détails du traitement, vous pouvez également envisager des objects sémaphores .