He estudiado El arte de la programación multiprocesador 1 y su texto carece de claridad, al igual que el libro al que se refiere. Aquí hay algunas citas de TAMPP:
Cita 1 (Definición de sin bloqueo)
Un método no tiene bloqueo si garantiza que, con frecuencia infinita, algunas llamadas de método finalizan en un número finito de pasos.
Cita 2 (Definición de no bloqueo)
nunca se requiere una invocación pendiente de un método total para esperar a que se complete otra invocación pendiente.
Cita 3 (afirme que sin bloqueo no se bloquea)
Las condiciones de progreso sin bloqueo sin espera y sin bloqueo garantizan que el cómputo en su conjunto avance, independientemente de cómo el sistema programe los subprocesos.
El problema es que el reclamo en la Cita 3 obviamente no se deriva de la definición en la Cita 1. Como ya se mencionó, una cola sincronizada parece satisfacer la Cita 1: infinitamente a menudo algún método adquirirá el bloqueo y se completará con éxito.
Observe específicamente la frase bastante vaga en la Cita 3: "independientemente de cómo el sistema programa los hilos". Esto no está precedido por ningún tipo de descripción formal del "sistema de programación de subprocesos", por lo que nos queda reconstruir sus propiedades en función de nuestras ideas preconcebidas sobre lo que deberían significar las definiciones :
- el sistema siempre ejecuta instrucciones de algún hilo;
- nunca puede ejecutar instrucciones de ningún hilo dado ;
- Todos los hilos están invocando el método en consideración.
En un sistema de este tipo, un método de bloqueo no puede estar libre de bloqueos: si el subproceso que mantiene el bloqueo nunca más se programa para la ejecución, no habrá otro subproceso que pueda completar la invocación de su método en un número finito de pasos, pero habrá algunos hilos que están ejecutando pasos del método. Para un sistema más realista, uno que garantice dar tiempo de CPU a cada hilo eventualmente, la definición debe incluir explícitamente la propiedad de no bloqueo:
Definición corregida de sin bloqueo
Un método no tiene bloqueo si no está bloqueado y, además, garantiza que, con frecuencia infinita, algunas llamadas de método finalicen en un número finito de pasos.
1 Maurice Herlihy, Nir Shavit, El arte de la programación multiprocesador, Elsevier 2008, pp. 58-60