En informática , un despertar espurio ocurre cuando un hilo se despierta tras esperar una variable de condición y descubre que dicha condición aún no se ha cumplido. Se denomina espurio porque el hilo aparentemente se ha despertado sin motivo aparente. Los despertares espurios suelen producirse porque, entre el momento en que se activó la variable de condición y el momento en que el hilo despertado finalmente pudo ejecutarse, otro hilo se ejecutó primero y modificó la condición. En general, si se despiertan varios hilos, el primero en ejecutarse encontrará la condición satisfecha, mientras que los demás podrían encontrarla insatisfecha. De esta forma, se produce una condición de carrera entre todos los hilos despertados. El primer hilo en ejecutarse ganará la carrera y encontrará la condición satisfecha, mientras que los demás perderán la carrera y experimentarán un despertar espurio.
El problema del despertar espurio puede agravarse en sistemas multiprocesador. Cuando varios hilos esperan una única variable de condición, el sistema puede decidir despertar a todos los hilos al recibir la señal. El sistema interpreta cada despertar de un hilo como un despertar de todos ellos, rompiendo así cualquier relación 1:1 esperada entre las señales y el despertar. [ 1 ] Si diez hilos están esperando, solo uno ganará y los otros nueve experimentarán un despertar espurio.signal( )broadcast( )
Para permitir flexibilidad en la implementación al manejar condiciones de error y condiciones de carrera dentro del sistema operativo , también se puede permitir que las variables de condición regresen de una espera incluso si no se les ha indicado, aunque no está claro cuántas implementaciones hacen eso. En la implementación de variables de condición de Solaris, puede ocurrir un despertar espurio sin que se asigne la condición si el proceso se indica; la llamada al sistema wait aborta y regresa EINTR. [ 2 ] La implementación de variables de condición de p-thread de Linux garantiza que no hará eso. [ 3 ] [ 4 ]
Debido a que pueden producirse despertares espurios, cuando un hilo se despierta tras esperar en una variable de condición, siempre debe comprobar que la condición que buscaba aún se cumple. Si no es así, debe volver a dormir en la variable de condición, esperando otra oportunidad. [ 5 ]
Referencias
- ↑ Chen, Raymond (1 de febrero de 2018). "Activaciones espurias en variables de condición de Win32" . Microsoft . Consultado el 9 de mayo de 2020 .
- ↑ "Esperas interrumpidas en variables de condición (solo subprocesos de Solaris)" . Oracle Corporation . Consultado el 9 de mayo de 2020 .
- ↑ "pthread_cond_wait(3) - Página man de Linux" . die.net . Consultado el 9 de mayo de 2020.
Estas funciones no deben devolver un código de error de [EINTR].
- ↑ "pthread_cond_timedwait, pthread_cond_wait - esperar en una condición" . The Open Group . 2018. Consultado el 9 de mayo de 2020 .
- ↑ Arpaci-Dusseau, Remzi; Arpaci-Dusseau, Andrea (noviembre de 2023). "Variables de condición" (PDF) . Sistemas operativos: tres piezas fáciles .
- Elementos básicos del sistema operativo
- Biblioteca C POSIX
- Hilos (informática)