Ho studiato l'arte della programmazione multiprocessore 1 e il loro testo è privo di chiarezza, proprio come il libro a cui fai riferimento. Ecco alcune citazioni da TAMPP:
Citazione 1 (Definizione di lock-free)
A method is lock-free if it guarantees that infinitely often some method call finishes in a finite number of steps.
Citazione 2 (Definizione di non blocco)
a pending invocation of a total method is never required to wait for another pending invocation to complete.
Quota 3 (afferma che il blocco è senza blocchi)
The wait-free and lock-free nonblocking progress conditions guarantee that the computation as a whole makes progress, independently of how the system schedules threads.
Il problema è che il reclamo in Quota 3 non segue ovviamente la definizione in Citazione 1. Come già accennato, una coda sincronizzata sembra soddisfare la Citazione 1: infinitamente spesso alcuni metodi acquisiscono con successo il blocco e lo completano.
Si noti in particolare la frase abbastanza vaga in Quota 3: "indipendentemente da come il sistema pianifica i thread". Questo non è preceduto da alcun tipo di descrizione formale del "sistema di schedatura del thread", quindi siamo lasciati a ricostruire le sue proprietà sulla base dei nostri preconcetti su cosa significano le definizioni dovrebbero :
- il sistema esegue sempre le istruzioni di alcuni thread;
- potrebbe non eseguire mai le istruzioni di alcun dato thread;
-
tutti i thread stanno invocando il metodo preso in considerazione.
Su un sistema di questo tipo, un metodo di blocco non può essere bloccato: se il thread che blocca il blocco non viene mai più pianificato per l'esecuzione, non ci sarà nessun altro thread che può completare l'invocazione del metodo in un numero finito di passaggi, eppure ci saranno alcuni thread che stanno eseguendo passi del metodo. Per un sistema più realistico, che garantisce di dare tempo CPU a ogni thread, la definizione deve includere esplicitamente la proprietà non bloccante:
Definizione corretta di lock-free
A method is lock-free if it is non-blocking and, additionally, guarantees that infinitely often some method call finishes in a finite number of steps.
1 Maurice Herlihy, Nir Shavit, L'arte della programmazione multiprocessore, Elsevier 2008, pp. 58-60