Inhaltsverzeichnis
Der Unterschied zwischen Mutex und Semaphor
Mutex (Mutex)
Semaphore
Heim häufiges Problem Was ist der Unterschied zwischen Semaphor und Mutex?

Was ist der Unterschied zwischen Semaphor und Mutex?

Nov 08, 2021 pm 02:24 PM
互斥量 信号量 线程

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.

Was ist der Unterschied zwischen Semaphor und Mutex?

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.

Was ist der Unterschied zwischen Semaphor und Mutex?

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:

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

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

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!

Erklärung dieser 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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was bedeuten 8 Kerne und 16 Threads? Was bedeuten 8 Kerne und 16 Threads? Feb 02, 2023 am 11:26 AM

8-Kern bedeutet, dass die CPU über 8 physische Kerne verfügt, und 16-Thread bedeutet, dass die CPU bis zu 16 Threads gleichzeitig ausführen kann. Die Anzahl der Kerne und Threads sind wichtige Leistungsindikatoren einer Computer-CPU. Je höher die Anzahl der Kerne der CPU, desto höher die Anzahl der Threads und desto günstiger die gleichzeitige Ausführung mehrerer Programme. weil die Anzahl der Threads der Anzahl entspricht, die die CPU zu einem bestimmten Zeitpunkt gleichzeitig ausführen kann. Die Anzahl der parallel zu verarbeitenden Aufgaben. Multithreading kann die superskalare Verarbeitung mit großen Problemen außerhalb der Reihenfolge maximieren, die Auslastung von Prozessor-Rechnerkomponenten verbessern und Verzögerungen beim Speicherzugriff verringern, die durch Datenkorrelation oder Cache-Fehler verursacht werden.

Best Practices für Mutexe in PHP-Programmen Best Practices für Mutexe in PHP-Programmen Jun 07, 2023 pm 12:40 PM

Mit dem Fortschritt der Zeit und der kontinuierlichen Aktualisierung der Technologie steigt die Nachfrage nach Webanwendungen und PHP-Programme sind zu einer der wichtigsten Programmiersprachen für viele Webanwendungen geworden. In einer Multithread-Webanwendung müssen Parallelität und Race-Bedingungen berücksichtigt werden, um sicherzustellen, dass das Programm ordnungsgemäß ausgeführt wird. In PHP-Programmen stellen Mutexe eine Lösung dar, um Thread-Sicherheit und Genauigkeit der Datenübertragung sicherzustellen. In diesem Artikel werden wir die Best Practices für Mutex in PHP-Programmen untersuchen. Was ist ein Mutex? Ein Mutex wird verwendet, um sicherzustellen, dass Threads

Gleichzeitige C++-Programmierung: Wie vermeidet man Thread-Aushungerung und Prioritätsumkehr? Gleichzeitige C++-Programmierung: Wie vermeidet man Thread-Aushungerung und Prioritätsumkehr? May 06, 2024 pm 05:27 PM

Um Thread-Aushunger zu vermeiden, können Sie faire Sperren verwenden, um eine faire Zuweisung von Ressourcen sicherzustellen, oder Thread-Prioritäten festlegen. Um die Prioritätsumkehr zu lösen, können Sie die Prioritätsvererbung verwenden, um die Priorität des Threads, der die Ressource enthält, vorübergehend zu erhöhen, oder die Sperrenerhöhung verwenden, um die Priorität des Threads zu erhöhen, der die Ressource benötigt.

Gleichzeitige C++-Programmierung: Wie führt man Thread-Beendigung und -Abbruch durch? Gleichzeitige C++-Programmierung: Wie führt man Thread-Beendigung und -Abbruch durch? May 06, 2024 pm 02:12 PM

Zu den Thread-Beendigungs- und Abbruchmechanismen in C++ gehören: Thread-Beendigung: std::thread::join() blockiert den aktuellen Thread, bis der Ziel-Thread die Ausführung abschließt. std::thread::detach() trennt den Ziel-Thread von der Thread-Verwaltung. Thread-Abbruch: std::thread::request_termination() fordert den Ziel-Thread auf, die Ausführung zu beenden; std::thread::get_id() erhält die Ziel-Thread-ID und kann mit std::terminate() verwendet werden, um das Ziel sofort zu beenden Faden. Im tatsächlichen Kampf ermöglicht request_termination() dem Thread, den Zeitpunkt der Beendigung zu bestimmen, und join() stellt dies in der Hauptzeile sicher

Was ist die kleinste Befehlsflusseinheit, wenn ein Programm ausgeführt wird? Was ist die kleinste Befehlsflusseinheit, wenn ein Programm ausgeführt wird? Aug 23, 2022 pm 02:16 PM

„Thread“ ist die kleinste Einheit des Befehlsflusses, wenn ein Programm ausgeführt wird. Ein Prozess bezieht sich auf ein Programm mit bestimmten unabhängigen Funktionen. Ein Thread ist Teil des Prozesses und beschreibt den Ausführungsstatus des Befehlsflusses. Der Thread ist die kleinste Einheit des Befehlsausführungsflusses im Prozess und die Grundeinheit der CPU-Planung. Ein Thread ist ein Ausführungsprozess einer Aufgabe (ein Programmsegment); ein Thread belegt keinen Speicherplatz, er ist im Speicherbereich des Prozesses enthalten. Innerhalb desselben Prozesses teilen sich mehrere Threads die Ressourcen des Prozesses; ein Prozess verfügt über mindestens einen Thread.

Java-Fehler: JavaFX-Thread steckt fest, wie man damit umgeht und ihn vermeidet Java-Fehler: JavaFX-Thread steckt fest, wie man damit umgeht und ihn vermeidet Jun 24, 2023 pm 05:52 PM

Bei der Entwicklung von JavaFX-Anwendungen treten häufig Fehler auf, bei denen der JavaFX-Thread hängen bleibt. Solche Fehler sind unterschiedlich schwerwiegend und können die Stabilität und Leistung des Programms beeinträchtigen. Um den normalen Betrieb des Programms sicherzustellen, müssen wir die Ursachen und Lösungen von JavaFX-Thread-Steckfehlern verstehen und wissen, wie wir verhindern können, dass dieser Fehler auftritt. 1. Die Ursache für den Fehler „JavaFX-Thread steckt fest“ JavaFX ist ein Multithread-UI-Anwendungsframework, das es Programmen ermöglicht, über einen längeren Zeitraum in Hintergrundthreads ausgeführt zu werden.

Was ist der Unterschied zwischen Coroutinen und Threads in der Go-Sprache? Was ist der Unterschied zwischen Coroutinen und Threads in der Go-Sprache? Feb 02, 2023 pm 06:10 PM

Unterschiede: 1. Ein Thread kann mehrere Coroutinen haben, und ein Prozess kann auch mehrere Coroutinen allein haben. 2. Threads sind ein Synchronisationsmechanismus, während Coroutinen asynchron sind. 3. Coroutinen können den Status des letzten Aufrufs beibehalten. Threads funktionieren nicht 4. Threads sind präventiv, während Coroutinen nicht präemptiv sind. 5. Threads sind geteilte CPU-Ressourcen und Coroutinen erfordern Threads zum Hosten und Ausführen.

Analyse des Unterschieds zwischen Threads und Prozessen in der Go-Sprache Analyse des Unterschieds zwischen Threads und Prozessen in der Go-Sprache Apr 03, 2024 pm 01:39 PM

Prozesse und Threads in der Go-Sprache: Prozess: Eine unabhängig laufende Programminstanz mit eigenen Ressourcen und eigenem Adressraum. Thread: Eine Ausführungseinheit innerhalb eines Prozesses, die Prozessressourcen und Adressraum gemeinsam nutzt. Merkmale: Prozess: hoher Overhead, gute Isolation, unabhängige Planung. Threads: geringer Overhead, gemeinsame Ressourcen, interne Planung. Praxisfall: Prozess: Isolieren lang laufender Aufgaben. Threads: Verarbeiten Sie große Datenmengen gleichzeitig.