Tengo entendido que las implementaciones más populares de un mutex (p. Ej., Std :: mutex en C ++) no garantizan la equidad , es decir, no garantizan que, en casos de contención, el bloqueo sea adquirido por hilos en el orden en que llamado lock (). De hecho, incluso es posible (aunque con suerte poco común) que en casos de alta contención, algunos de los hilos que esperan adquirir el mutex nunca lo adquieran.
Esto me parece un comportamiento inútil, me parece que un mutex justo produciría un comportamiento más acorde con lo que un programador querría / esperaría.
La razón dada por la cual los mutexes generalmente no se implementan para ser justos es el "rendimiento", pero me gustaría entender mejor lo que eso significa, en particular, ¿cómo la relajación del requisito de equidad de mutex mejora el rendimiento? Parece que un mutex "justo" sería trivial de implementar: simplemente haga que lock () agregue el hilo de llamada a la cola de la lista vinculada de mutex antes de poner el hilo a dormir, y luego haga desbloquear () pop el siguiente hilo de la cabeza de esa misma lista y despiértala.
¿Qué idea de implementación de mutex me estoy perdiendo aquí, que explicaría por qué se consideró que valía la pena sacrificar la justicia por un mejor rendimiento?