Насколько я понимаю, большинство популярных реализаций мьютекса (например, std :: mutex в C ++) не гарантируют справедливости, то есть они не гарантируют, что в случаях конфликта блокировка будет получена потоками в том порядке, в котором они называется блокировка (). На самом деле, даже возможно (хотя мы надеемся, что это необычно), что в случаях высокой конкуренции некоторые потоки, ожидающие получения мьютекса, могут никогда не получить его.
Мне кажется, что это бесполезное поведение - мне кажется, что справедливый мьютекс приведет к тому, что поведение будет в большей степени соответствовать ожиданиям / ожиданиям программиста.
Причина, по которой мьютексы обычно не реализуются для обеспечения справедливости, - это «производительность», но я бы хотел лучше понять, что это означает, в частности, как ослабление требования справедливости мьютекса улучшает производительность? Кажется, что реализовать «честный» мьютекс было бы тривиально - просто сделайте, чтобы lock () добавляла вызывающий поток в конец связанного списка мьютекса перед тем, как перевести поток в спящий режим, а затем unlock () выводила следующий поток из глава этого же списка и разбудить его.
Какое понимание реализации мьютекса я здесь упускаю, что объясняет, почему считалось целесообразным пожертвовать честностью ради лучшей производительности?