Estudei The Art of Multiprocessor Programming 1 e seu texto está faltando em clareza, assim como o livro a que você se refere. Aqui estão algumas citações do TAMPP:
Citação 1 (Definição de bloqueio)
Um método é livre de bloqueios se garantir que infinitamente muitas vezes alguma chamada de método seja concluída em um número finito de etapas.
Citação 2 (Definição de não bloqueio)
uma invocação pendente de um método total nunca é necessária para aguardar a conclusão de outra invocação pendente.
Citação 3 (alegar que o bloqueio é livre de bloqueio)
As condições de progresso sem bloqueio e sem espera e sem bloqueio garantem que o cálculo como um todo progrida, independentemente de como o sistema agende os encadeamentos.
O problema é que a alegação na citação 3 obviamente não segue a definição da citação 1. Como já mencionado, uma fila sincronizada parece satisfazer a citação 1: infinitamente, com frequência, algum método obtém com êxito o bloqueio e é concluído.
Observe especificamente a frase bastante vaga da citação 3: "independentemente de como o sistema agende os threads". Isso não é precedido por nenhum tipo de descrição formal do "sistema de agendamento de encadeamentos"; portanto, resta reconstruir suas propriedades com base em nossos preconceitos sobre o que as definições devem significar:
- o sistema sempre executa instruções de algum encadeamento;
- ele nunca pode executar instruções de qualquer dado fio;
- todos os threads estão invocando o método em consideração.
Nesse sistema, um método de bloqueio não pode ser livre de bloqueios: se o encadeamento que segura o trava nunca for agendado novamente para execução, não haverá outro encadeamento que possa concluir sua invocação de método em um número finito de etapas, mas haverá alguns segmentos que estão executando etapas do método. Para um sistema mais realista, que garanta tempo de CPU para cada thread eventualmente, a definição deve incluir explicitamente a propriedade nonblocking:
Definição corrigida de livre de bloqueio
Um método é livre de bloqueios se não for bloqueador e, além disso, garante que infinitamente muitas vezes alguma chamada de método seja concluída em um número finito de etapas.
1 Maurice Herlihy, Nir Shavit, A Arte da Programação em Multiprocessador, Elsevier 2008, pp. 58-60