Vergleich zwischen Semaphore und Mutex.
Mutex
Das Konzept des Mutex ist ähnlich wie das des Schlosses. Wenn man einen Raum betreten will, muss man das Schloss erwerben, um die Erlaubnis zum Betreten zu haben. In der Informatik wird der Mutex verwendet, um kritische Abschnitte zu schützen und zu verhindern, dass andere Threads gegenseitig auf denselben Code zugreifen, um Wettlaufbedingungen zu vermeiden.
Thread A Thread Bacquire mutex acquire mutex ... it will block
do something critical do something critical
release mutex release lock
Ist ein Schlüssel zu einer Toilette. Eine Person kann den Schlüssel haben – die Toilette benutzen – zur gleichen Zeit. Wenn die Person fertig ist, gibt sie den Schlüssel an die nächste Person in der Warteschlange weiter.
Offiziell: „Mutexe werden typischerweise verwendet, um den Zugriff auf einen Teil des ablaufenden Codes zu serialisieren, der nicht gleichzeitig von mehr als einem Thread ausgeführt werden kann. Ein Mutex-Objekt erlaubt nur einem Thread den Zugriff auf einen kontrollierten Bereich und zwingt andere Threads, die versuchen, Zugriff auf diesen Bereich zu erhalten, zu warten, bis der erste Thread diesen Bereich verlassen hat.“
Ref: Symbian Developer Library
Semaphore
Nicht wie Mutex werden entweder erworben oder warten darauf, erworben zu werden. Semaphore kann den Anfangswert auf N>1 setzen. Wir können diesen Wert verwenden, um einzuschränken, wie viele Benutzer in diesem Prozess auf den kritischen Abschnitt zugreifen dürfen.
Der Hauptunterschied zwischen Semaphore und Mutex ist, dass Mutex nur von dem Benutzer freigegeben werden kann, der sie hält. Beim Semaphor-Mechanismus kann jedoch jeder Benutzer ein Signal an einen bestimmten Semaphor im Kernel senden. Dies kann die Gleichzeitigkeit von Threads sicherstellen.
Unten ist das Konzept von Semaphoren, wenn Thread A OK ist, dann signalisiert er Thread B und beginnt etwas zu tun.
Dieser Mechanismus stellt die Gleichzeitigkeit im Prozess sicher.
Task A Task B
... Take BinSemaphore <== wait for something
Do Something Noteworthy
Give BinSemaphore do something <== unblocks
Ist die Anzahl der freien identischen Toilettenschlüssel. Beispiel: Wir haben vier Toiletten mit identischen Schlössern und Schlüsseln. Der Semaphor Count – die Anzahl der Schlüssel – wird zu Beginn auf 4 gesetzt (alle vier Toiletten sind frei), dann wird der Zählwert dekrementiert, wenn Leute reinkommen. Wenn alle Toiletten voll sind, d.h. es gibt keine freien Schlüssel mehr, ist der Semaphorwert 0. Wenn nun eine Person die Toilette verlässt, wird der Semaphorwert auf 1 erhöht (ein freier Schlüssel) und an die nächste Person in der Warteschlange vergeben.
Offiziell: „Ein Semaphor schränkt die Anzahl der gleichzeitigen Benutzer einer gemeinsam genutzten Ressource auf eine maximale Anzahl ein. Threads können den Zugriff auf die Ressource anfordern (Dekrementierung des Semaphors) und signalisieren, dass sie die Nutzung der Ressource beendet haben (Inkrementierung des Semaphors).“
Ref: Symbian Developer Library
Risiken
Bei der Verwendung des Mutex kann es zu Prioritätsumkehrungen kommen. Sie müssen das auf dem Mutex basierende Szenario sorgfältig entwerfen.