Concepts liés aux threads 1. Synchronisation des threads ManualResetEvent La méthode Set() définit l’état sur Signaled Reset() pour le régler sur aucun signal WaitOne() bloquera jusqu’à ce qu’il ait un signal, et s’il y a un signal au moment de l’appel de WaitOne, il ne bloquera pas AutoResetEvent La différence avec ManualResetEvent est qu’AutoResetEvent.WaitOne() modifie automatiquement l’état de l’objet événement, c’est-à-dire que l’état de l’événement change à chaque exécution d’AutoResetEvent.WaitOne(). Signal - > pas de signal ; Pas de signal – > a un signal
example:
myResetEven.Set(), qui est en réalité équivalent à un switch, si la méthode set() n’est pas exécutée, le waitOne() suivant ne pourra pas attendre la notification pour la laisser exécuter, de sorte que l’instruction après waitOne ne sera pas exécutée. Méthode de surveillance Le mécanisme Wait() Pulse() est utilisé pour l’interaction interthread, lorsqu’un objet émet Monitor.Wait(), le thread qui accède à l’objet reste en état d’attente. jusqu’à ce qu’il reçoive un signal de réveil. Monitor.Pulse() est utilisé pour envoyer des signaux au thread en attente. C’est-à-dire que, dans la zone critique entre Monitor.Enter() et Monitor.Exit(), pour libérer le verrou sur l’objet et bloquer le thread courant, il est en état d’attente dans la file d’attente.
La serrure est différente de la Mutex Synchronisation de verrous entre plusieurs threads Synchronisation de plusieurs threads entre processus Mutex, ou synchronisation de plusieurs processus Dans la programmation multithread .Net, les classes AutoResetEvent et ManualResetEvent sont souvent utilisées, et leur usage est très similaire, mais il existe des différences. La méthode Set place le signal à l’état d’envoi, la méthode Reset place le signal à l’état non-envoy, et WaitOne attend que le signal soit envoyé. L’état initial du constructeur peut être déterminé par la valeur du paramètre ; s’il est vrai, il ne bloque pas, et faux est l’état de blocage. Si un thread appelle la méthode WaitOne, le thread reçoit le signal lorsqu’il est en état d’envoi et continue de s’exécuter vers le bas. La différence est qu’après l’appel, AutoResetEvent.WaitOne() ne permet qu’un seul thread d’entrer à la fois, et lorsqu’un thread reçoit un signal, AutoResetEvent met automatiquement le signal en état « no send state, » et les autres threads appelant WaitOne ne peuvent que continuer à attendre. C’est-à-dire qu’AutoResetEvent ne réveille qu’un seul thread à la fois ; ManualResetEvent peut réveiller plusieurs threads, car lorsqu’un thread appelle la méthode ManualResetEvent.Set(), les autres threads appelant WaitOne reçoivent le signal pour continuer l’exécution, et ManualResetEvent ne règle pas automatiquement le signal pour ne pas être envoyé. En d’autres termes, à moins que la méthode ManualResetEvent.Reset() ne soit appelée manuelly, le ManualResetEvent restera signalé et le ManualResetEvent peut réveiller plusieurs threads simultanément pour poursuivre l’exécution. |