Rozumiem, że najpopularniejsze implementacje muteksu (np. Std :: mutex w C ++) nie gwarantują uczciwości - to znaczy, nie gwarantują, że w przypadku niezgody zamek zostanie przejęty przez wątki w kolejności, w jakiej o nazwie lock (). W rzeczywistości jest nawet możliwe (choć mam nadzieję, że rzadkie), że w przypadkach dużej rywalizacji niektóre wątki oczekujące na muteks mogą go nigdy nie nabyć.
Wydaje mi się to nieprzydatnym zachowaniem - wydaje mi się, że uczciwy muteks dałby zachowanie bardziej zgodne z tym, czego programista chciałby / oczekiwałby.
Podany powód, dla którego muteksy zwykle nie są wprowadzane w celu zachowania uczciwości, to „wydajność”, ale chciałbym lepiej zrozumieć, co to oznacza - w szczególności, w jaki sposób złagodzenie wymogu uczciwości muteksu poprawia wydajność? Wydaje się, że „sprawiedliwy” muteks byłby trywialny do wdrożenia - wystarczy, że lock () doda wątek wywołujący do końca listy połączonych mutexów przed uśpieniem, a następnie odblokuje () pop następny wątek z na czele tej samej listy i obudźcie ją.
Jakich informacji na temat wdrażania mutexów brakuje mi tutaj, co wyjaśniałoby, dlaczego warto poświęcić sprawiedliwość dla lepszej wydajności?