Entendo que as implementações mais populares de um mutex (por exemplo, std :: mutex em C ++) não garantem imparcialidade - ou seja, elas não garantem que, em casos de contenção, o bloqueio seja adquirido por threads na ordem em que eles chamado lock (). De fato, é até possível (embora seja esperançosamente incomum) que, em casos de alta contenção, alguns dos threads que aguardam a aquisição do mutex possam nunca adquiri-lo.
Isso parece um comportamento inútil para mim - parece-me que um mutex justo produziria um comportamento mais alinhado com o que um programador iria querer / esperar.
A razão apontada para o motivo pelo qual os mutexes normalmente não são implementados para ser justo é o "desempenho", mas eu gostaria de entender melhor o que isso significa - em particular, como o relaxamento do requisito de justiça do mutex melhora o desempenho? Parece que um mutex "justo" seria trivial de implementar - basta fazer com que lock () acrescente o encadeamento de chamada ao final da lista vinculada do mutex antes de colocar o encadeamento em suspensão e, em seguida, faça com unlock () que apareça o próximo encadeamento de o chefe da mesma lista e acorde.
Que insight de implementação de mutex estou perdendo aqui, que explicaria por que foi considerado útil sacrificar a justiça por um melhor desempenho?