Heim >
Artikel > Was ist der Unterschied zwischen Semaphor und Mutex?
Was ist der Unterschied zwischen Semaphor und Mutex?
青灯夜游Original
2021-11-08 14:24:3918569Durchsuche
Unterschied: 1. Mutex wird für den gegenseitigen Ausschluss von Threads verwendet, und Semaphor wird für die Synchronisierung von Threads verwendet. 2. Der Mutex-Wert kann nur 0 oder 1 sein, und der Semaphorwert kann eine nicht negative Ganzzahl sein. 3. Mutex Die Sperre und das Entsperren der Menge muss entsprechend von demselben Thread verwendet werden. Das Semaphor kann von einem Thread freigegeben und von einem anderen Thread erhalten werden.
Die Betriebsumgebung dieses Tutorials: Windows 7-System, Dell G3-Computer.
Der Unterschied zwischen Mutex und Semaphor
1 Mutex wird für den gegenseitigen Ausschluss von Threads verwendet, und Semaphor wird für die Synchronisierung von Threads verwendet.
Dies ist der grundlegende Unterschied zwischen Mutexen und Semaphoren, also der Unterschied zwischen gegenseitigem Ausschluss und Synchronisation.
Gegenseitiger Ausschluss: bedeutet, dass eine bestimmte Ressource nur einem Besucher gleichzeitig den Zugriff ermöglicht, was einzigartig und exklusiv ist. Gegenseitiger Ausschluss kann jedoch nicht die Reihenfolge einschränken, in der Besucher auf Ressourcen zugreifen, d. h. der Zugriff ist ungeordnet.
Synchronisierung: bezieht sich auf den geordneten Zugriff von Besuchern auf Ressourcen durch andere Mechanismen auf der Grundlage gegenseitigen Ausschlusses (in den meisten Fällen). In den meisten Fällen implementiert die Synchronisierung bereits einen gegenseitigen Ausschluss, insbesondere wenn sich alle Schreibvorgänge auf Ressourcen gegenseitig ausschließen müssen. In einigen Fällen können mehrere Besucher gleichzeitig auf Ressourcen zugreifen
2 Der Mutex-Wert kann nur 0/1 sein und der Semaphorwert kann eine nicht negative Ganzzahl sein.
Mit anderen Worten, ein Mutex kann nur für den gegenseitigen exklusiven Zugriff auf eine Ressource verwendet werden und kann keinen gegenseitigen Multithread-Ausschluss mehrerer Ressourcen implementieren. Semaphore kann den gegenseitigen Ausschluss mehrerer Threads und die Synchronisierung mehrerer ähnlicher Ressourcen realisieren. Wenn es sich bei dem Semaphor um einen einwertigen Semaphor handelt, kann auch ein sich gegenseitig ausschließender Zugriff auf eine Ressource abgeschlossen werden.
3. Das Sperren und Entsperren des Mutex muss jeweils von demselben Thread verwendet werden. Das Semaphor kann von einem Thread freigegeben und von einem anderen Thread erhalten werden.
Mutex (Mutex)
Mutex ist eine Datenstruktur, die das Phänomen des gegenseitigen Ausschlusses darstellt und auch als binäres Semaphor verwendet wird. Ein Mutex ist im Grunde ein Multitasking-empfindliches Binärsignal, das zur Synchronisierung des Verhaltens mehrerer Aufgaben verwendet werden kann. Es wird häufig verwendet, um kritische Codeabschnitte vor Interrupts zu schützen und die bei der Synchronisierung verwendeten Ressourcen gemeinsam zu nutzen.
Mutex ist im Wesentlichen eine Sperre, die exklusiven Zugriff auf Ressourcen ermöglicht. Die Hauptfunktion von Mutex besteht also im gegenseitigen Ausschluss. Der Wert des Mutex-Objekts hat nur zwei Werte 0 und 1. Diese beiden Werte repräsentieren auch die beiden Zustände von Mutex. Der Wert ist 0, was den Sperrstatus des aktuellen Objekts anzeigt. Wenn der Benutzerprozess/Thread versucht, kritische Ressourcen zu sperren, wird der Wert 1 angezeigt, was den aktuellen Status anzeigt Das Objekt ist inaktiv und der Benutzerprozess/Thread kann kritische Ressourcen sperren. Danach verringert sich der Mutex-Wert um 1 und wird zu 0.
Mutex kann in vier Operationen abstrahiert werden:
-Create
-Lock
-Unlock
-Destroy
Mutex kann bei seiner Erstellung einen Anfangswert haben, was bedeutet, dass er auch nach der Erstellung des Mutex vorhanden ist Gesperrter Zustand oder Ruhezustand. Um einen Deadlock zu verhindern, lässt das System im selben Thread nicht zu, dass der Mutex zweimal hintereinander gesperrt wird (das System kehrt normalerweise sofort nach dem zweiten Aufruf zurück). Mit anderen Worten, die beiden entsprechenden Vorgänge zum Sperren und Entsperren müssen im selben Thread ausgeführt werden.
Mutex-Funktionen, die in verschiedenen Betriebssystemen bereitgestellt werden:
Aktion/System
Win32
Linyx
Solaris
Erstellen
CreateMutex
pthread_mutex_init
mutex_init
lock
WaitForSingleObject
pthread_mutex_lock
mutex_lock
unlock
ReleaseMutex
pthread_mutex_unlock
Umutex_unlock
Zerstörung
Closehandle
pthread_mutex_destroy
mutex_destroy
Deadlock tritt hauptsächlich auf, wenn mehrere abhängige Sperren vorhanden sind, und tritt auf, wenn ein Thread versucht, den Mutex in der entgegengesetzten Reihenfolge wie ein anderer Thread zu sperren. Bei der Verwendung von Mutexen sollte besonders darauf geachtet werden, einen Deadlock zu vermeiden.
Im Allgemeinen gibt es mehrere ungeschriebene Grundprinzipien:
Sie müssen eine Sperre erhalten, bevor Sie gemeinsam genutzte Ressourcen bearbeiten.
Achten Sie darauf, die Sperre nach Abschluss des Vorgangs aufzuheben.
Besetzen Sie die Sperre so kurz wie möglich.
Wenn mehrere Sperren vorhanden sind und die Erwerbsreihenfolge ABC ist, sollte auch die Freigabereihenfolge ABC sein.
Wenn ein Thread mit einem Fehler zurückkehrt, sollte er die erworbene Sperre aufheben.
Vielleicht sind einige Leser neugierig, wie man die Vorgänge „Warten unterbrechen“ und „Wartenthread aufwecken“ implementieren kann? Jeder Mutex verfügt über eine Warteschlange. Wenn ein Thread auf den Mutex warten möchte, muss er sich zuerst zur Warteschlange hinzufügen, dann den Thread-Status auf „Ruhezustand“ setzen und dann die Scheduler-Funktion aufrufen, um zu einem anderen Thread zu wechseln. Wenn ein Thread andere Threads in der Warteschlange aufwecken möchte, muss er lediglich ein Element aus der Warteschlange herausnehmen, seinen Status von „Ruhezustand“ in „Bereit“ ändern und sich der „Bereitschaftswarteschlange“ anschließen. Anschließend wechselt er möglicherweise zum Aufwecken Zeitpunkt, zu dem die Scheduler-Funktion ausgeführt wird.
Wenn derselbe Thread beim zweiten Aufruf die Sperre zweimal aufruft, legt der Thread normalerweise auf und wartet darauf, dass andere Threads die Sperre aufheben Der Thread wird erneut angehalten, ohne die Möglichkeit, die Sperre aufzuheben, sodass er sich immer in einem angehaltenen Wartezustand befindet. Dies wird als Deadlock bezeichnet. Eine weitere typische Deadlock-Situation ist folgende: Thread A erhält Sperre 1 und Thread B erhält Sperre 2. Zu diesem Zeitpunkt ruft Thread A Sperre auf, um zu versuchen, Sperre 2 zu erhalten. Daher muss er hängen bleiben und warten, bis Thread B freigegeben wird Sperre 2 und dies Zu diesem Zeitpunkt ruft Thread B auch Sperre auf, um zu versuchen, Sperre 1 zu erhalten. Daher muss er warten, bis Thread A Sperre 1 freigibt, sodass sich beide Threads A und B für immer in einem angehaltenen Zustand befinden. Es ist nicht schwer vorstellbar, dass das Problem eines möglichen Deadlocks komplizierter und schwer zu beurteilen wird, wenn mehr Threads und mehr Sperren beteiligt sind.
Semaphore
Semaphore, manchmal auch Semaphore genannt, ist eine Einrichtung, die in einer Multithread-Umgebung verwendet wird. Sie ist für die Koordination verschiedener Threads verantwortlich, um sicherzustellen, dass sie öffentliche Ressourcen korrekt und angemessen nutzen können.
Semaphore können in mehrere Kategorien unterteilt werden:
Binäre Semaphore (binäre Semaphore): Nur die Semaphore darf einen Wert von 0 oder 1 annehmen und kann nur von einem Thread gleichzeitig erfasst werden.
Integer-Semaphor: Der Wert des Semaphors ist eine Ganzzahl, die von mehreren Threads gleichzeitig abgerufen werden kann, bis der Wert des Semaphors 0 wird.
Semaphor aufzeichnen: Zusätzlich zu einem ganzzahligen Wert (Anzahl) verfügt jedes Semaphor über eine Warteschlangenliste, die die Identität jedes im Semaphor blockierten Threads angibt. Wenn ein Semaphor freigegeben wird und der Wert um eins erhöht wird, weckt das System automatisch einen wartenden Thread aus der Warteschlange, sodass dieser den Semaphor erhalten kann, und gleichzeitig wird der Semaphor um eins dekrementiert.
Das Semaphor steuert den Zugriff auf gemeinsam genutzte Ressourcen über einen Zähler. Der Wert des Semaphors ist eine nicht negative Ganzzahl, und alle Threads, die ihn übergeben, verringern die Ganzzahl um eins. Wenn der Zähler größer als 0 ist, ist der Zugriff zulässig und der Zähler wird um 1 verringert. Wenn er 0 ist, ist der Zugriff verboten und alle Threads, die versuchen, ihn zu übergeben, befinden sich im Wartezustand.
Das Ergebnis der Zählerberechnung ist der Pass, der den Zugriff auf die gemeinsam genutzte Ressource ermöglicht. Um auf eine gemeinsam genutzte Ressource zuzugreifen, muss ein Thread einen Pass vom Semaphor erhalten. Wenn die Anzahl der Semaphore größer als 0 ist, erhält dieser Thread einen Pass, was dazu führt, dass die Anzahl der Semaphore verringert wird wird blockieren, bis es einen Pass bekommt. Wenn dieser Thread nicht mehr auf die gemeinsam genutzte Ressource zugreifen muss, gibt er den Durchgang frei, wodurch die Anzahl der Semaphoren erhöht wird. Wenn ein anderer Thread auf den Durchgang wartet, erhält dieser Thread den Durchgang zu diesem Zeitpunkt.
Semaphor kann in fünf Operationen abstrahiert werden:
- Erstellen Erstellen
- Warten auf Warten:
Der Thread wartet auf den Semaphor, der größer als 0 ist, und erhält den Wert wird um eins reduziert; wenn er nur gleich 0 ist, wechselt der Thread in den Ruhezustand, bis der Semaphorwert größer als 0 ist oder eine Zeitüberschreitung auftritt.
-Release Post
führt die Freigabe des Semaphors aus und der Wert wird um eins erhöht. Wenn zu diesem Zeitpunkt ein wartender Thread vorhanden ist, wird der Thread aktiviert.
-Versuch, auf TryWait zu warten
Wenn TryWait aufgerufen wird, erhält der Thread das Semaphor nicht tatsächlich, sondern prüft, ob der Semaphorwert größer als 0 ist, andernfalls gibt TryWait Erfolg zurück. es gibt einen Fehler zurück.
-Zerstören
Semaphore kann zum Schutz von zwei oder mehr Schlüsselcodesegmenten verwendet werden. Diese Schlüsselcodesegmente können nicht gleichzeitig aufgerufen werden. Bevor der Thread einen kritischen Codeabschnitt betritt, muss er ein Semaphor erhalten. Wenn im kritischen Codeabschnitt keine Threads vorhanden sind, tritt der Thread sofort in diesen Teil des Blockdiagramms ein. Sobald der kritische Codeabschnitt abgeschlossen ist, muss der Thread das Semaphor freigeben. Andere Threads, die diesen kritischen Codeabschnitt betreten möchten, müssen warten, bis der erste Thread das Semaphor freigibt. Um diesen Vorgang abzuschließen, müssen Sie ein Semaphor erstellen und dann die VIs „Semaphore erwerben“ und „Semaphore freigeben“ am Anfang und am Ende jedes kritischen Codeabschnitts platzieren. Stellen Sie sicher, dass diese Semaphor-VIs auf das ursprünglich erstellte Semaphor verweisen.
Aktion/System
Win32
POSIX
Erstellen
Semaphor erstellen
sem_init
Wait
WaitForSingleObject
sem _wait
release
ReleaseMutex
sem _post
versuche es. warte
WaitForSingleObject
sem _trywait
destroy
CloseHandle
sem_destroy
Weitere Informationen zu diesem Thema finden Sie in der Spalte FAQ!
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Semaphor und Mutex?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn