Porównanie semafora i muteksu.
Muteks
Koncepcje dotyczące muteksu są podobne do zamka. Kiedy chcesz wejść do pokoju, musisz zdobyć zamek, a następnie mieć pozwolenie na wejście. W informatyce, muteks jest używany do ochrony krytycznej sekcji uniemożliwiającej innym wątkom wzajemny dostęp do tego samego kodu w celu uniknięcia stanu wyścigu.
Thread A Thread Bacquire mutex acquire mutex ... it will block
do something critical do something critical
release mutex release lock
Jest kluczem do toalety. Jedna osoba może mieć klucz – zajmować toaletę – w danym momencie. Po zakończeniu osoba ta oddaje (uwalnia) klucz następnej osobie w kolejce.
Oficjalnie: „Muteksy są zwykle używane do serializacji dostępu do sekcji kodu re-entrant, który nie może być wykonywany współbieżnie przez więcej niż jeden wątek. Obiekt muteksa zezwala tylko jednemu wątkowi na dostęp do kontrolowanej sekcji, zmuszając inne wątki, które próbują uzyskać dostęp do tej sekcji, do czekania, aż pierwszy wątek opuści tę sekcję.”
Ref: Symbian Developer Library
Semafor
Nie tak jak muteksy albo są nabywane, albo czekają na nabycie. Semafor może ustawić wartość początkową na N>1. Możemy użyć tej wartości do ograniczenia liczby użytkowników w tym procesie, którzy będą mieli dostęp do sekcji krytycznej.
Główną różnicą między semaforem a muteksem jest to, że muteks może być zwolniony tylko przez użytkownika, który go posiada. Natomiast w mechanizmie semaforowym każdy użytkownik może wysłać sygnał do dowolnego semafora w jądrze. To może zapewnić współbieżność wątków.
Poniżej przedstawiona jest koncepcja semafora, kiedy wątek A jest OK, wtedy sygnalizuje wątek B, wtedy wątek B zaczyna coś robić.
Ten mechanizm zapewnia współbieżność w procesie.
Task A Task B
... Take BinSemaphore <== wait for something
Do Something Noteworthy
Give BinSemaphore do something <== unblocks
Istnieje liczba wolnych identycznych kluczy do toalety. Przykład, powiedzmy, że mamy cztery toalety z identycznymi zamkami i kluczami. Semafor count – liczba kluczy – jest ustawiony na 4 na początku (wszystkie cztery toalety są wolne), następnie wartość licznika jest dekrementowana w miarę wchodzenia ludzi. Jeśli wszystkie toalety są pełne, tzn. nie ma wolnych kluczy, liczba semaforów wynosi 0. Teraz, gdy np. jedna osoba opuszcza toaletę, semafor jest zwiększany do 1 (jeden wolny klucz) i przekazywany następnej osobie w kolejce.
Oficjalnie: „Semafor ogranicza liczbę jednoczesnych użytkowników współdzielonego zasobu do maksymalnej liczby. Wątki mogą żądać dostępu do zasobu (dekrementacja semafora) i mogą sygnalizować, że zakończyły korzystanie z zasobu (inkrementacja semafora).”
Ref: Symbian Developer Library
Ryzyko
Używanie muteksa może napotkać Inwersję Priorytetu. Będziesz musiał starannie zaprojektować scenariusz oparty na muteksie.