Ho studiato The Art of Multiprocessor Programming 1 e il loro testo manca di chiarezza, proprio come il libro a cui ti riferisci. Ecco alcune citazioni da TAMPP:
Citazione 1 (definizione di senza blocco)
Un metodo è senza blocco se garantisce che infinitamente spesso una chiamata al metodo termina in un numero finito di passaggi.
Citazione 2 (Definizione di non blocco)
una chiamata in sospeso di un metodo totale non è mai richiesta per attendere il completamento di un'altra chiamata in sospeso.
Preventivo 3 (affermare che il blocco non è bloccabile)
Le condizioni di avanzamento senza blocco e senza blocco e attesa garantiscono che il calcolo nel suo insieme proceda, indipendentemente da come il sistema pianifica i thread.
Il problema è che l'affermazione della citazione 3 non segue ovviamente la definizione della citazione 1. Come già accennato, una coda sincronizzata sembra soddisfare la citazione 1: infinitamente spesso alcuni metodi acquisiscono correttamente il blocco e completano.
Nota in particolare la frase piuttosto vaga nella citazione 3: "indipendentemente da come il sistema pianifica i thread". Questo non è preceduto da alcun tipo di descrizione formale del "sistema di schedulazione dei thread", quindi siamo lasciati a ricostruire le sue proprietà in base ai nostri preconcetti su cosa dovrebbero significare le definizioni :
- il sistema esegue sempre le istruzioni di alcuni thread;
- non può mai eseguire le istruzioni di un dato thread;
- tutti i thread invocano il metodo in esame.
Su un tale sistema, un metodo di blocco non può essere privo di blocco: se il thread che tiene il blocco non è mai più programmato per l'esecuzione, non ci sarà nessun altro thread in grado di completare la sua chiamata al metodo in un numero finito di passaggi, ma ci sarà alcuni thread che stanno eseguendo i passaggi del metodo. Per un sistema più realistico, che garantisca alla fine il tempo di CPU per ciascun thread, la definizione deve includere esplicitamente la proprietà non-blocking:
Definizione corretta di lock-free
Un metodo è senza blocco se non è bloccante e, inoltre, garantisce che infinitamente spesso una chiamata al metodo termina in un numero finito di passaggi.
1 Maurice Herlihy, Nir Shavit, The Art of Multiprocessor Programming, Elsevier 2008, pagg. 58-60