För jämförelse mellan semafor och mutex.
Mutex
Begreppen för mutex är ungefär som lås. När du vill komma in i ett rum måste du skaffa dig låset och sedan ha tillåtelse att komma in. Inom datavetenskap används mutex för att skydda kritiska avsnitt och förhindra att andra trådar får ömsesidig tillgång till samma kod för att undvika kapplöpning.
Thread A Thread Bacquire mutex acquire mutex ... it will block
do something critical do something critical
release mutex release lock
Är en nyckel till en toalett. En person kan ha nyckeln och använda toaletten samtidigt. När personen är klar ger (frigör) nyckeln till nästa person i kön.
Officiellt: ”Mutexes används vanligtvis för att serialisera åtkomst till en del av återkommande kod som inte kan exekveras samtidigt av mer än en tråd. Ett mutex-objekt tillåter endast en tråd att komma in i en kontrollerad sektion och tvingar andra trådar som försöker få tillgång till sektionen att vänta tills den första tråden har lämnat sektionen.”
Ref: Symbian Developer Library
Semaphore
Inte som mutex antingen förvärvas eller väntar på att bli förvärvade. Semafore kan ställa in startvärdet till N>1. Vi kan använda värdet för att begränsa hur många användare i denna process som får tillgång till det kritiska avsnittet.
Den största skillnaden mellan semafor och mutex är att mutex endast kan släppas av den användare som innehar den. Men i semaformekanismen kan vilken användare som helst signalera till vilken specifik semafor som helst i kärnan. Detta kan säkerställa trådkonkurrens.
Nedan följer begreppet semafor, när tråd A är OK signalerar tråd B och tråd B börjar göra något.
Denna mekanism säkerställer konkurrens i processen.
Task A Task B
... Take BinSemaphore <== wait for something
Do Something Noteworthy
Give BinSemaphore do something <== unblocks
Är antalet lediga identiska toalettnycklar. Exempel: Vi har fyra toaletter med identiska lås och nycklar. Semafonräkningen – antalet nycklar – sätts till 4 i början (alla fyra toaletterna är lediga), sedan minskas räknevärdet allteftersom folk kommer in. Om alla toaletter är fulla, dvs. det finns inga lediga nycklar kvar, är semaforens värde 0. När en person lämnar toaletten ökas semaforen till 1 (en ledig nyckel) och ges till nästa person i kön.
Officiellt: ”En semafor begränsar antalet samtidiga användare av en delad resurs upp till ett maximalt antal. Trådar kan begära tillgång till resursen (dekrementera semaforen) och kan signalera att de har slutat använda resursen (inkrementera semaforen).”
Ref: Symbian Developer Library
Risker
Användning av mutex kan stöta på Priority Inversion. Du måste noggrant utforma scenariot baserat på mutex.