Ver varias preguntas relacionadas con el bloqueo y (casi) siempre encontrar el 'bucle debido a los despertadores espurios' Me pregunto si alguien ha experimentado tal tipo de activación (suponiendo un entorno de hardware/software decente, por ejemplo).¿Realmente ocurren los despertadores espurios?
Sé que el término "espúreo" no significa razón aparente, pero ¿cuáles pueden ser los motivos de tal tipo de evento?
(1 Nota: No estoy cuestionando la práctica de bucle.)
Editar: Una pregunta helper (para los que como ejemplos de código):
si tengo el siguiente programa y lo ejecuto:
public class Spurious {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Condition cond = lock.newCondition();
lock.lock();
try {
try {
cond.await();
System.out.println("Spurious wakeup!");
} catch (InterruptedException ex) {
System.out.println("Just a regular interrupt.");
}
} finally {
lock.unlock();
}
}
}
¿Qué puedo hacer para reactivar el await
hasta falsamente sin esperar por siempre para un evento al azar?
Mejor explicación aquí: http://stackoverflow.com/questions/1461913/does-c-monitor-wait-suffer-from-spurious-wakeups/1461956#1461956 – Gili
Este desbloqueo EINTR se aplica a todas las llamadas al sistema de bloqueo en Unix derivado sistemas. Esto simplificó los lotes del kernel, pero los programadores de aplicaciones compraron la carga. –
Pensé que pthread_cond_wait() y amigos no podrían devolver EINTR, pero ¿devuelve cero si se despierta espurio? De: http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cond_wait.html "Estas funciones no devolverán un código de error de [EINTR]". – gubby