/ / Si llama a EventWaitHandle.Set () X veces, ¿señalará X hilos si X los hilos aún no han comenzado? - c #, multiproceso

Si llama a EventWaitHandle.Set () X veces, ¿señalará X hilos si X los hilos no han comenzado aún? - c #, multihilo

En otras palabras tengo un hilo que comienza y llama. waitHandle.Set() varias veces. Entonces comienzo varios hilos y cada uno está esperando en eso. WaitHandle. ¿Se señalará una X de ellos donde X es el número de veces que se llama el hilo original? waitHandle.Set()?

¿Hay una estructura que apoye lo que estoy tratando de lograr más estrechamente?

Respuestas

9 para la respuesta № 1

Tal vez, pero probablemente no.

Un evento solo se puede configurar o anular, si haynada para desactivar el evento, entonces las llamadas repetidas a Set no cambiarán su estado, a menos que sea un evento de reinicio automático y haya al menos un hilo esperando en él. Con un evento de reinicio manual, cualquier subproceso en espera (o que comience a esperar) se liberará hasta que algo desactive el evento.

Creo que realmente querrás un semáforo, que tiene un conteo y admite la configuración norte tiempos para liberar norte subprocesos (incluso si algunos de esos subprocesos solo comienzan a esperar después de algunas de las llamadas a establecer).


3 para la respuesta № 2

Depende de EventResetMode. Si se establece en EventResetMode.AutoReset solo lanzará un hilo. Si es "EventResetMode.ManualReset" sin embargo, liberará todos los subprocesos bloqueados en el evento.

Semaphore.Release(Int)

Donde Int es la cuenta sería uno manera de hacer esto.


1 para la respuesta № 3

Como dijo Richard, EventWaitHandles solo tiene una marca y no puede contar el número de veces que se ha llamado a Set. La solución simple de agregar una variable de conteo causa una condición de carrera.

William Kempf tiene un artículo sobre por qué las variables de conteo no funcionan, y una solución que usa la clase .Net Monitor.