Sincronización Primitiva con IO/Kit
-
25-10-2019 - |
Pregunta
Estoy buscando una sincronización de espera/señal primitiva en io/kit que funcione como:
Thread1: Wait (MyEvent) // Bloqueo de hilo1
Thread2: Wait (MyEvent) // Bloqueo de hilo2
Thread3: señal (myevent) // libera uno de Thread1 o Thread2
Esto no se puede hacer usando un Iolock ya que las operaciones de bloqueo/desbloqueo estarían hechas de diferentes hilos, lo cual es una mala idea según algunos documentos que he leído.
Thread1, 2, 3 pueden ser hilos de usuario o hilos de kernel.
También me gustaría tener un tiempo opcional con la operación de espera.
Gracias por tu ayuda !
Solución
Quieres la función IOLockSleepDeadline()
, declarado en <IOKit/IOLocks.h>
.
Configuras un sencillo IOLock
en algún lugar con IOLockAlloc()
antes de que empieces. Luego, los hilos 1 y 2 bloquean el iolock con IOLockLock()
e inmediatamente renuncia a la cerradura y vete a dormir llamando IOLockSleepDeadline()
. Cuando el hilo 3 está listo, llama IOLockWakeup()
(con oneThread = true
Si solo quieres despertar un solo hilo). Esto hace que el hilo 1 o 2 se despierte e inmediatamente adquiere la cerradura (por lo que necesitan desbloquear o dormir nuevamente).
IOLockSleep()
Funciona de manera similar, pero sin el tiempo de espera.
Puedes hacer algo similar usando El método CommandSleep () del ioocommandgate () que puede ser más apropiado si su conductor ya está centrado en un IOWorkLoop
.
Otros consejos
La documentación del método IOLocks::IOLockLock
establece lo siguiente:
Bloquea el mutex. Si el hilo sostiene el bloqueo, bloquee su desbloqueo. Esta función puede bloquear y, por lo tanto, no debe llamarse desde el nivel de interrupción o mientras se mantiene un bloqueo de giro. Bloquear el mutex recursivamente de un hilo dará como resultado un punto muerto.
Por lo tanto, ciertamente bloqueará los otros hilos (T1 y T2) hasta que el hilo que sostiene el bloqueo lo libera (T3). Una cosa que no parece soportar es el tiempo de espera.