Я розумію, що більшість популярних реалізацій mutex (наприклад, std :: mutex в C ++) не гарантують справедливості - тобто вони не гарантують, що у випадках суперечки замок буде набутий потоками в тому порядку, який вони називається lock (). Насправді навіть можливо (хоча, сподіваємось, нечасто), що у випадках високої суперечності деякі нитки, які чекають набуття мютексу, ніколи не можуть його придбати.
Це здається мені ненадійною поведінкою - мені здається, що справедливий мутекс спричинить поведінку більше відповідно до того, що хотів / очікує програміст.
Причина, чому мутекси, як правило, не реалізуються, щоб бути справедливими, - це "ефективність", але я хотів би краще зрозуміти, що це означає - зокрема, як розслаблення вимог щодо справедливості мутексу покращує ефективність? Здається, що "справедливий" мьютекс було б тривіально реалізовувати - просто встановіть lock (), додайте викликову нитку до хвоста списку пов'язаних файлів mutex перед тим, як покласти нитку в режим сну, а потім розблокувати () спливати наступну нитку з голова того самого списку і розбудити його.
Яку інформацію про впровадження мютексу я тут не пропускаю, це пояснювало б, чому вважалося доцільним жертвувати справедливістю для кращої роботи?