998 Stimmen

Unterschied zwischen binärem Semaphor und Mutex

Gibt es einen Unterschied zwischen einem binären Semaphor und einem Mutex oder sind sie im Wesentlichen dasselbe?

18 Stimmen

Semantisch sind sie gleich, aber in der Praxis werden Sie seltsame Unterschiede feststellen (besonders unter Windows).

10 Stimmen

@Michael Foukarakis: Was sind die merkwürdigen Unterschiede?

5 Stimmen

Ich nehme an, seltsam war nicht der richtige Ausdruck. Ein Mutex unterstützt auch den Besitz und manchmal den Wiedereintritt. Dies ist in Windows der Fall. Darüber hinaus sind Semaphoren in Windows auf Event-Objekte implementiert, aber ich bin mir nicht sicher, welche praktischen Auswirkungen dies hat.

821voto

Benoit Punkte 36144

Sie sind PAS die gleiche Sache. Sie werden für unterschiedliche Zwecke verwendet!
Obwohl beide Arten von Semaphoren einen Voll/Leer-Zustand haben und dieselbe API verwenden, ist ihre Verwendung sehr unterschiedlich.

Semaphore mit gegenseitigem Ausschluss
Semaphore mit gegenseitigem Ausschluss werden verwendet, um gemeinsam genutzte Ressourcen (Datenstruktur, Datei usw.) zu schützen.

Eine Mutex-Semaphore gehört der Aufgabe, die sie übernimmt. Wenn Task B versucht, eine Mutex, die sich im Besitz von Task A befindet, zu semGive, gibt der Aufruf von Task B einen Fehler zurück und schlägt fehl.

Mutexe verwenden immer die folgende Reihenfolge:

  - SemTake
  - Critical Section
  - SemGive

Hier ist ein einfaches Beispiel:

  Thread A                     Thread B
   Take Mutex
     access data
     ...                        Take Mutex  <== Will block
     ...
   Give Mutex                     access data  <== Unblocks
                                  ...
                                Give Mutex

Binäres Semaphor
Binary Semaphore behandelt eine ganz andere Frage:

  • Aufgabe B ist in der Warteschleife und wartet auf ein Ereignis (z. B. die Auslösung eines Sensors).
  • Der Sensor wird ausgelöst und eine Unterbrechungsdienstroutine läuft. Sie muss eine Aufgabe über die Auslösung informieren.
  • Task B sollte laufen und die entsprechenden Maßnahmen für die Sensorauslösung ergreifen. Dann kehrt sie zum Warten zurück.

    Task A Task B ... Take BinSemaphore <== wait for something Do Something Noteworthy Give BinSemaphore do something <== unblocks

Bei einem binären Semaphor ist es in Ordnung, wenn B das Semaphor nimmt und A es gibt.
Auch hier gilt, dass ein binäres Semaphor eine Ressource NICHT vor dem Zugriff schützt. Der Akt des Gebens und Nehmens eines Semaphors ist grundsätzlich entkoppelt.
In der Regel macht es wenig Sinn, wenn ein und dieselbe Aufgabe ein Geben und ein Nehmen auf demselben binären Semaphor darstellt.

14 Stimmen

Ist ein Mutex dann nicht besser als ein binäres Semaphor? Denn es macht keinen Sinn, wenn jemand eine Sperre freigibt, die er eigentlich nicht besitzt.

172 Stimmen

Sie haben unterschiedliche Zwecke. Ein Mutex dient dem exklusiven Zugriff auf eine Ressource. Ein binäres Semaphor sollte für die Synchronisation verwendet werden (z.B. "Hey, jemand, das ist passiert!"). Der Binary-"Geber" teilt dem "Nehmer" einfach mit, dass das, worauf er gewartet hat, passiert ist.

6 Stimmen

@Pacerier Sie verwechseln den Zweck. Ein Mutex ist dazu gedacht, eine kritische Region zu schützen. Sie haben recht, dass es keinen Sinn macht, eine binäre Semaphore zu verwenden. Ich werde die Antwort aktualisieren, um den Zweck der beiden zu erklären.

544voto

Mladen Janković Punkte 7479
  • A Mutex kann nur freigegeben werden durch den Faden, der ihn erworben hatte .

  • A binärer Semaphor kann signalisiert werden nach einem beliebigen Muster (oder Prozess).

Daher sind Semaphoren für einige Synchronisationsprobleme wie Producer-Consumer besser geeignet.

Unter Windows sind binäre Semaphoren eher Ereignisobjekte als Mutexe.

41 Stimmen

Mutex can be released only by thread that had acquired it -- Ich habe gerade mit einem einfachen pthread_mutex-basierten Programm versucht, einen Thread zu entsperren, der im Hauptthread gesperrt ist

22 Stimmen

@warl0ck Wie in der Manpage von pthread_mutex_lock linux.die.net/man/3/pthread_mutex_lock : "Wenn der Mutex-Typ PTHREAD_MUTEX_ERRORCHECK ist, muss eine Fehlerprüfung vorgesehen werden....Wenn ein Thread versucht, einen Mutex zu entsperren, den er nicht gesperrt hat, oder einen Mutex, der entsperrt ist, muss ein Fehler zurückgegeben werden."

56 Stimmen

@warl0ck Bitte sehen Sie stackoverflow.com/a/5492499/385064 Pthreads hat 3 verschiedene Arten von Mutexen: Schnelle Mutex, rekursive Mutex und fehlerprüfende Mutex. Sie haben eine schnelle Mutex verwendet, die aus Leistungsgründen nicht auf diesen Fehler hin überprüft wird. Wenn Sie die fehlerüberprüfende Mutex unter Linux verwenden, werden Sie die erwarteten Ergebnisse erhalten.'

493voto

dlinsin Punkte 18343

Das Beispiel der Toilette ist eine unterhaltsame Analogie:

Mutex:

Ist ein Schlüssel zu einer Toilette. Eine Person kann den Schlüssel haben - die Toilette benutzen - zu der Zeit. Wenn sie fertig ist, gibt die Person den Schlüssel an die nächste Person weiter Person in der Warteschlange.

Offiziell: "Mutexe werden typischerweise verwendet, um den Zugriff auf einen Abschnitt zu serialisieren reentranten Code zu serialisieren, der nicht gleichzeitig von mehr als einem Thread ausgeführt Thread ausgeführt werden kann. Ein Mutex-Objekt erlaubt nur einem Thread in einen kontrollierten Abschnitt, zwingt andere Threads, die versuchen auf diesen Abschnitt zuzugreifen, zu warten warten müssen, bis der erste Thread den diesem Abschnitt verlassen hat." Ref: Symbian Entwickler Bibliothek

(Ein Mutex ist eigentlich eine Semaphore mit Wert 1.)

Semaphor:

Ist die Anzahl der freien Toiletten identisch? Tasten. Beispiel: Wir haben vier Toiletten mit identischen Schlössern und Schlüsseln. Die Semaphorenzahl - die Anzahl der Schlüssel - wird zu Beginn auf 4 gesetzt (alle vier Toiletten sind frei), dann wird die Anzahl Wert dekrementiert, wenn die Leute kommen. Wenn alle Toiletten voll sind, d.h. es gibt keine freien Tasten mehr, ist der Semaphor-Zählung 0. Wenn nun eq. eine Person die Toilette verlässt, wird der Semaphor auf 1 erhöht (eine freie Schlüssel) und wird an die nächste Person in der der Warteschlange.

Offiziell: "Ein Semaphor schränkt die Anzahl der gleichzeitigen Benutzer einer gemeinsamen Ressource bis zu einer maximalen Anzahl. Threads können den Zugriff auf die Ressource anfordern (Dekrementieren der Semaphore), und können signalisieren, dass sie die Nutzung der Ressource beendet haben (Inkrementieren der Semaphore)." Ref: Symbian Entwickler-Bibliothek

289 Stimmen

... aber dies ist in Bezug auf Mutex vs Zählen Semaphore. Die Frage wurde über binäre gefragt.

32 Stimmen

Was David sagt, ist zwar richtig, aber es ist NICHT die Antwort auf die gestellte Frage. Die Antwort von Mladen Jankovic ist die Antwort auf die gestellte Frage, in der es um die Unterscheidung zwischen "Binär-Semaphore" und "Mutex" geht.

24 Stimmen

Leider hat diese falsche Antwort mehr Stimmen als die beste Antwort von @Benoit

179voto

teki Punkte 1942

Schöne Artikel zum Thema:

Aus Teil 2:

Der Mutex ist ähnlich wie die Prinzipien des binären Semaphors mit einem wesentlichen Unterschied: das Prinzip des Besitzes. Eigentümerschaft ist das einfache Konzept, dass, wenn eine Aufgabe sperrt eine Mutex sperrt (erwirbt), kann nur sie sie entsperren (freigeben) kann. Wenn eine Task versucht einen Mutex zu entsperren, den er nicht gesperrt hat (und nicht besitzt), wird eine Fehlerbedingung aufgetreten und, was am wichtigsten ist, der Mutex wird nicht entsperrt. Wenn der Objekt des gegenseitigen Ausschlusses nicht über Eigentum hat, dann ist es, unabhängig davon, wie es genannt wird, ist es kein Mutex.

0 Stimmen

Danke für den Link, die Erklärungen dort sind hervorragend. Der Link hat sich geändert: feabhas.com/blog/2009/09/ (Verwenden Sie < Vor und Weiter >, um zu den beiden anderen Artikeln zu gelangen.

0 Stimmen

Beachten Sie, dass das Fehlen des Eigentumsrechts das Betriebssystem daran hindert, die Prioritätsinversion zu umgehen. Aus diesem Grund verwende ich für Producer/Consumer-Architekturen in der Regel Bedingungsvariablen anstelle von Semaphoren.

3 Stimmen

+1 für ausgezeichnete Artikel-Links. Der beste Artikel, der Semaphore und Mutex mit "was-es-ist" und "was-es-tut" erklärt computing.llnl.gov/tutorials/pthreads Ich hatte diesen Artikel als meine "Behind the Scene"-Referenz verwendet, die technisch gesehen alles über Mutex/Conditionals und andere darauf aufbauende Konstrukte wie Semaphore/Barriere/Reader-Writer erklärt, aber nirgends explizit und prägnant auf Probleme mit Konstrukten eingeht. Kurz gesagt, es ist eine Referenz :)

117voto

Hemant Punkte 4427

Da keine der obigen Antworten die Verwirrung aufklärt, ist hier eine, die meine Verwirrung aufklärte.

Streng genommen, ein Mutex ist ein Sperrmechanismus verwendet, um den Zugriff auf eine Ressource zu synchronisieren. Nur eine Aufgabe (kann ein Thread oder Prozess, je nach Betriebssystemabstraktion) kann den Mutex erwerben. Das bedeutet Eigentum an der Mutex, und nur der Eigentümer kann die Mutex die Sperre (Mutex) freigeben.

Semaphor ist ein Signalisierungsmechanismus ("Ich bin fertig, ihr könnt weitermachen"). Wenn Sie zum Beispiel Lieder auf Ihrem Handy hören (nehmen Sie das als eine Aufgabe) auf Ihrem Handy und gleichzeitig ruft Ihr Freund Sie an, wird eine Unterbrechung ausgelöst, auf die eine Interrupt-Service-Routine (ISR) der Anrufverarbeitungsaufgabe signalisiert, aufzuwachen.

Quelle: http://www.geeksforgeeks.org/mutex-vs-semaphore/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X