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 !

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top