Conceptos relacionados con hilos 1. Sincronización de hilos ManualResetEvent El método Set() establece el estado en Signaled Reset() para ponerlo en sin señal WaitOne() bloqueará hasta que tenga señal, y si hay señal en el momento de llamar a WaitOne, no se bloqueará AutoResetEvent La diferencia con ManualResetEvent es que AutoResetEvent.WaitOne() cambia automáticamente el estado del objeto evento, es decir, el estado del evento cambia cada vez que se ejecuta AutoResetEvent.WaitOne(). Señal - > sin señal; Sin señal – > tiene señal
example:
myResetEven.Set(), que en realidad es equivalente a un switch, si el método set() no se ejecuta, el siguiente waitOne() no podrá esperar a que la notificación lo permita ejecutar, por lo que la instrucción posterior a waitOne no se ejecutará. Método del monitor El mecanismo Wait() Pulse() se utiliza para la interacción entre hilos, cuando un objeto emite Monitor.Wait(), el hilo que accede al objeto permanecerá en estado de espera. hasta que recibe una señal de despertar. Monitor.Pulse() se utiliza para enviar señales al hilo en espera. Es decir, en el área crítica entre Monitor.Enter() y Monitor.Exit(), para liberar el bloqueo del objeto y bloquear el hilo actual, este está en estado de espera en la cola.
El candado es diferente al de Mutex Sincronización de bloqueos entre múltiples hilos Sincronización de múltiples hilos entre procesos Mutex, o sincronización de múltiples procesos En la programación multihilo .Net, se utilizan a menudo las clases AutoResetEvent y ManualResetEvent, y su uso es muy similar, aunque existen diferencias. El método Set pone la señal en estado de envío, el método Reset pone la señal en estado no enviado, y WaitOne espera a que se envíe la señal. El estado inicial del constructor puede determinarse por el valor del parámetro; si es verdadero, no está bloqueando, y falso es el estado de bloqueo. Si un hilo llama al método WaitOne, el hilo recibe la señal cuando está en estado de envío y continúa ejecutándose hacia abajo. La diferencia es que, tras la llamada, AutoResetEvent.WaitOne() solo permite que entre un hilo a la vez, y cuando un hilo recibe una señal, AutoResetEvent automáticamente pondrá la señal en estado de sin envío, y los otros hilos que llaman a WaitOne solo pueden seguir esperando. Es decir, AutoResetEvent despierta solo un hilo a la vez; ManualResetEvent puede despertar varios hilos, porque cuando un hilo llama al método ManualResetEvent.Set(), los otros hilos que llaman a WaitOne reciben la señal para continuar la ejecución, y el ManualResetEvent no configura automáticamente la señal para que no se envíe. En otras palabras, a menos que el método ManualResetEvent.Reset() se llame manualmente, el ManualResetEvent permanecerá señalizado y el ManualResetEvent puede despertar varios hilos al mismo tiempo para continuar la ejecución. |