Une seule SetEvent() déclencher de multiples WaitForSingleObject()
Ce:
http://msdn.microsoft.com/en-us/library/ms686915(SV.85).aspx
Semblerait suggérer de ne pas.
J'ai trois processus de communication à travers des tuyaux. Le processus A Crée un événement, le Processus B & C chaque utilisation WaitForSingleObject (dans un deuxième thread).
Alors maintenant, nous avons DEUX Processus chaque en attente pour un SEUL événement.
Processus de feux de l'événement avec SetEvent(), le Processus B répond, processus de C ne l'est pas.
Conclusion:
Chaque WaitForSingleObject() nécessite un Événement unique... Correct?
Vous devez vous connecter pour publier un commentaire.
Utilisation réinitialisation manuelle des événements pour déclencher plusieurs threads hors d'un événement unique.
Ici est un exemple qui utilise le "Manuel de l'Événement de Réinitialisation" drapeau
Vous pouvez utiliser la Réinitialisation Manuelle Evenets et la PulseEvent fonction à la libération de tous les threads en attente de l'événement.
Noter, cependant, que cette approche est intrinsèquement racé, qu'il n'y a aucun moyen de savoir qui sont "les discussions actuellement en attente de ...". Vous devez utiliser un plus fiable mécanisme de synchronisation si l'appariement exact de la fonction de réveil/2 événements d'attente sont nécessaires.
J'espère que cet exemple peut vous aider à:
A) si vous créez un événement avec le même
NAME
, chaquesetEvent
signalisationwaitforsingleobjects
B) si vous créez un événement, avec une unique
NAME
, lesetEvent
seulement envoie le signal référencé poignéeUn événement peut notifier plusieurs threads si c'est un événement de réinitialisation manuelle. Un événement de réinitialisation automatique ne peut pas le faire. Si plus d'un de la bande de roulement est en attente simultanément pour un événement de réinitialisation automatique, et vous le mettre à l'état signalé, un seul thread existe et le remet à zéro, et le comportement des autres threads ne sera pas défini. Bien que, à partir de la documentation de Microsoft, on peut supposer qu'un et un seul thread à la sortie, tandis que d'autres seraient certainement pas la sortie. De toute façon, nous devons prendre la citation qui suit en considération: “Ne supposez pas du premier entré, premier sorti (FIFO) de commande. Des événements externes tels que mode noyau Apc peut changer l'attente de commande” Source - https://msdn.microsoft.com/en-us/library/windows/desktop/ms682655(v=vs. 85).aspx
La fonction CreateEvent a la bManualReset paramètre. Si elle est TRUE, la fonction crée un événement de réinitialisation manuelle de l'objet, ce qui nécessite l'utilisation de la fonction ResetEvent pour définir l'événement à l'état de non signalé. Si ce paramètre est FALSE, la fonction crée un événement de réinitialisation automatique de l'objet, et le système entraîne automatiquement la réinitialisation de l'événement état non signalé après un seul thread en attente a été libéré, c'est à dire qu'il a quitté à partir d'une fonction comme WaitForMultipleObjects ou WaitForSigleObject – mais, comme je l'ai écrit avant, un seul thread sera notifiée pas tous.
Que sur le PulseEvent – il n'est pas fiable et ne doit jamais être utilisé -- voir https://msdn.microsoft.com/en-us/library/windows/desktop/ms684914(v=vs. 85).aspx
Seulement ces threads sont notifiées par PulseEvent qui sont en "attente" de l'état à l'instant PulseEvent est appelé. S'ils sont dans un autre état, ils ne seront pas avisés, et vous ne pouvez jamais savoir avec certitude ce que l'état du thread est. Un thread en attente sur un objet de synchronisation peut être momentanément retiré de l'état d'attente par un noyau en mode Asynchrone Appel de Procédure, et est ensuite retourné à l'état d'attente après l'APC est terminée. Si l'appel à PulseEvent se produit pendant le temps où le fil a été supprimé de l'état d'attente, le fil ne sera pas publié car PulseEvent uniquement les sorties de ces threads en attente au moment où il est appelé. Vous pouvez en savoir plus sur le noyau en mode Asynchrone Appels de Procédure (APC) sur les liens suivants:
Vous pouvez obtenir plus d'idées sur la fonction de réinitialisation automatique des événements et réarmement manuel d'événements à partir de l'article suivant: