pthreads mutex gegen semaphor

Lesezeit: 8 Minuten

Benutzeravatar von cppdev
cppdev

Was ist der Unterschied zwischen Semaphoren und Mutex, die von der pthread-Bibliothek bereitgestellt werden?

  • Semaphoren werden nicht von pthreads bereitgestellt und können auch in Programmen ohne Threads verwendet werden.

    – vergänglich

    14. Januar 2010 um 18:51 Uhr

  • jedes Synchronisationskonstrukt kann in Code ohne Threads verwendet werden 😛

    – Hassan Syed

    14. Januar 2010 um 19:15 Uhr

  • Nun, der Unterschied, den ich hervorheben wollte, ist, dass Semaphore vor pthreads verwendet wurden. Sie können eine platzieren sem_t im gemeinsam genutzten Speicher und verwenden Sie ihn, um Operationen zwischen Prozessen zu synchronisieren. Andererseits müssen Sie, auch wenn Sie nicht mehrere Threads erstellen, kompilieren und verknüpfen mit -pthread um zu verwenden pthread_mutex_*. (Einige Plattformen erzwingen dies nicht, aber das ist der Standard.)

    – vergänglich

    14. Januar 2010 um 20:51 Uhr


  • @ephemient, eigentlich man sem_init unter Linux sagt: Link with -pthread. Ich vermute also, dass Linux POSIX nicht buchstabengetreu folgt.

    – Alexis Wilke

    28. Mai 2014 um 2:07 Uhr

Benutzeravatar von Hassan Syed
Hassan Sydney

Semaphoren haben einen synchronisierten Zähler und Mutex’s sind nur binär (wahr / falsch).

Ein Semaphor wird oft als definitiver Mechanismus verwendet, um zu beantworten, wie viele Elemente einer Ressource verwendet werden – z. B. könnte ein Objekt, das n Worker-Threads darstellt, einen Semaphor verwenden, um zu zählen, wie viele Worker-Threads verfügbar sind.

Die Wahrheit ist, dass Sie ein Semaphor durch ein INT darstellen können, das durch einen Mutex synchronisiert wird.

  • Nicht sehen opengroup.org/onlinepubs/009695399/functions/sem_wait.html und opengroup.org/onlinepubs/009695399/functions/….

    – Richard Pennington

    14. Januar 2010 um 16:51 Uhr

  • Ein signifikanter Unterschied (weil ich Leute gesehen habe, die diesen Fehler schon früher gemacht haben): Ein Semaphor kann von jedem Thread in jeder Sequenz beschafft und geräumt werden (solange die Zählung niemals negativ ist), ein Mutex jedoch schon nur durch den Thread entsperrt werden, der sie gesperrt hat. Der Versuch, einen Mutex zu entsperren, der von einem anderen Thread gesperrt wurde, ist ein undefiniertes Verhalten.

    – vergänglich

    14. Januar 2010 um 18:50 Uhr

  • @ephemient, das wäre eine großartige Antwort gewesen, sehr aufschlussreich

    – Matt Tischler

    15. Januar 2010 um 9:06 Uhr

  • @ephemient: Aus dem Grund, den Sie angeben, ist die letzte Behauptung in der Antwort falsch: Sie KÖNNEN ein Semaphor NICHT durch ein INT darstellen, das durch einen Mutex synchronisiert wird, da Sie, wenn der Mutex gehalten wird, das Int nicht von einem anderen erhöhen/verringern können Thread, und Sie müssen warten, bis der Sperrthread den Mutex freigibt. Der grundlegende Unterschied besteht darin, dass der Mutex im Besitz ist, während der Semaphor nicht im Besitz ist. Und dieser Besitz wird durch die auferlegte Synchronisation an den INT übertragen. Sie erhalten also einen hybriden, eigenen Semaphor, irgendwo zwischen dem unbesessenen Semaphor und dem besessenen Mutex.

    – Benutzer1284631

    12. Februar 2013 um 11:15 Uhr


  • Ich denke, diese Antwort vermisst immer noch einen SEHR entscheidenden Unterschied zwischen einem Semaphor und einem Mutex. das ist der gebrauch. Semaphoren sind Signalmechanismen in ihrem Herzen; die Tatsache, dass sie von jedem Thread inkrementiert und dekrementiert werden können, ist nur eine Folge davon. Semaphore werden verwendet, um anderen Kontrollflüssen etwas zu signalisieren, das mit der Synchronisation zusammenhängt (wie ein vollständig/leerer Puffer). Ein Mutex hingegen wird immer verwendet, um den mehrfachen Zugriff auf ein gemeinsames Objekt zu schützen. Das ist ein großer Unterschied und die Leute scheinen es irgendwie immer zu vermissen, oder ich verstehe nie, was sie sagen wollen. 😛

    – Fingolfin

    11. Juni 2013 um 20:45 Uhr


Benutzeravatar von Paxi
Paxi

Ich werde über Mutex vs. Binary-Semaphore sprechen. Sie verwenden offensichtlich Mutex, um zu verhindern, dass auf Daten in einem Thread gleichzeitig von einem anderen Thread zugegriffen wird.

(Nehmen Sie an, Sie haben gerade lock() aufgerufen und sind dabei, auf Daten zuzugreifen. Das bedeutet, dass Sie nicht erwarten, dass ein anderer Thread (oder eine andere Instanz desselben Thread-Codes) auf dieselben Daten zugreift, die durch die gesperrt sind gleichen Mutex. Das heißt, wenn es sich um denselben Thread-Code handelt, der auf einer anderen Thread-Instanz ausgeführt wird und auf die Sperre trifft, sollte lock() den Kontrollfluss blockieren.)

Dies gilt für einen Thread, der einen anderen Thread-Code verwendet, der auch auf dieselben Daten zugreift und der auch durch denselben Mutex gesperrt ist.

In diesem Fall sind Sie immer noch dabei, auf die Daten zuzugreifen, und Sie können beispielsweise weitere 15 Sekunden benötigen, um die Mutex-Entsperrung zu erreichen (damit der andere Thread, der in der Mutex-Sperre blockiert wird, die Blockierung aufhebt und die Kontrolle zulässt Zugriff auf die Daten).

Erlauben Sie jemals einem anderen Thread, denselben Mutex einfach zu entsperren, und erlauben Sie im Gegenzug dem Thread, der bereits in der Mutex-Sperre wartet (blockiert), die Blockierung aufzuheben und auf die Daten zuzugreifen? (Ich hoffe, Sie haben verstanden, was ich hier sage.)

Gemäß der vereinbarten universellen Definition,

  • mit „mutex“ kann das nicht passieren. Kein anderer Thread kann die Sperre in Ihrem Thread aufheben
  • bei „binary-semaphore“ kann das passieren. Jeder andere Thread kann die Sperre in Ihrem Thread aufheben

Wenn Sie also sehr genau darauf achten, binäre Semaphore anstelle von Mutex zu verwenden, dann sollten Sie beim „Scoping“ der Sperren und Entsperrungen sehr vorsichtig sein, ich meine, dass jeder Kontrollfluss, der jede Sperre trifft, einen Unlock-Aufruf treffen sollte und auch es sollte kein „first unlock“ geben, sondern immer „first lock“.

  • Ich mag Umfang Teil. Es bezieht sich auf den Implementierungsteil, der sich in binärem Semaphor und Mutex unterscheidet.

    – KRoy

    17. Mai 2016 um 18:06 Uhr

Das Toilettenbeispiel

Mutex:

Ist ein Schlüssel zu einer Toilette. Eine Person kann den Schlüssel – die Toilette – zu der Zeit besetzen. Wenn er fertig ist, gibt (befreit) die Person den Schlüssel an die nächste Person in der Warteschlange.

“Mutexe werden normalerweise verwendet, um den Zugriff auf einen Abschnitt von wiedereintrittsfähigem Code zu serialisieren, der nicht gleichzeitig von mehr als einem Thread ausgeführt werden kann. Ein Mutex-Objekt lässt nur einen Thread in einen kontrollierten Abschnitt zu und zwingt andere Threads, die versuchen, Zugriff auf diesen Abschnitt zu erhalten zu warten, bis der erste Thread diesen Abschnitt verlassen hat.”

(Ein Mutex ist eigentlich ein Semaphor mit dem Wert 1.)

Semaphor:

Ist die Anzahl der kostenlosen identischen Toilettenschlüssel. Angenommen, wir haben vier Toiletten mit identischen Schlössern und Schlüsseln. Der Semaphore-Count – die Anzahl der Schlüssel – wird zu Beginn auf 4 gesetzt (alle vier Toiletten sind frei), dann wird der Zählwert bei eintretenden Personen dekrementiert. Wenn alle Toiletten voll sind, dh. keine freien Schlüssel mehr vorhanden sind, ist die Anzahl der Semaphoren 0. Wenn nun Gl. Eine Person verlässt die Toilette, die Semaphore wird auf 1 erhöht (ein freier Schlüssel) und an die nächste Person in der Warteschlange weitergegeben.

“Ein Semaphor beschränkt die Anzahl gleichzeitiger Benutzer einer gemeinsam genutzten Ressource auf eine maximale Anzahl. Threads können den Zugriff auf die Ressource anfordern (Verringern des Semaphors) und signalisieren, dass sie die Verwendung der Ressource beendet haben (Erhöhen des Semaphors).”

Quelle

C Benutzeravatar des Lernenden
C Lernender

Mutex wird verwendet, um eine Racebedingung zwischen mehreren Threads zu vermeiden.

während Semaphore als synchronisierendes Element verwendet wird, das über mehrere Prozesse hinweg verwendet wird.

mutex kann nicht durch binäres Semaphor ersetzt werden, da ein Prozess auf Semaphor wartet, während ein anderer Prozess Semaphor freigibt. Im Fall von Mutex werden sowohl die Erfassung als auch die Freigabe von demselben gehandhabt.

Benutzeravatar von KRoy
KRoy

Der Unterschied zwischen der semaphore und mutex ist der Unterschied zwischen Mechanismus und Muster. Der Unterschied liegt in ihrem Zweck (Absicht) und wie sie funktionieren (verhalten).

Das mutex, barrier, pipeline sind Parallele Programmiermuster. Mutex wird genutzt(beabsichtigt) zum Schutz von a critical section und sicherstellen mutual exclusion. Barrier lässt die Agenten (Thread/Prozess) weiter aufeinander warten.

Eines der Merkmale (Verhalten) von mutex Das Muster besteht darin, dass nur zugelassene Agenten (Prozess oder Thread) in einen kritischen Abschnitt eintreten können und nur diese Agenten diesen freiwillig verlassen können.

Es gibt Fälle, in denen mutex ermöglicht jeweils nur einen Agenten. Es gibt Fälle, in denen mehrere Agenten (mehrere Leser) zugelassen und einige andere Agenten (Schreiber) nicht zugelassen werden.

Das semaphore ist ein Mechanismus das kann verwendet werden (beabsichtigt), um verschiedene Muster zu implementieren. Es ist(Verhalten) allgemein a Flagge(ggf. durch gegenseitigen Ausschluss geschützt). (Eine interessante Tatsache ist sogar mutex Muster kann verwendet werden, um Semaphore zu implementieren).

In der Populärkultur semaphores sind Mechanismen, die von Kerneln bereitgestellt werden, und mutexes werden von der User-Space-Bibliothek bereitgestellt.

Beachten Sie, dass es Missverständnisse darüber gibt semaphores und mutexes. Es steht dass semaphores werden für verwendet synchronization. Und mutexes hat ownership. Dies liegt an beliebten OS-Büchern. Aber die Wahrheit ist, dass alle Mutexe, Semaphoren und Barrieren für die Synchronisation verwendet werden. Die Absicht von Mutex ist es nicht ownership aber mutual exclusion. Dieses Missverständnis führte zu einer beliebten Interviewfrage, in der nach dem Unterschied gefragt wurde mutexes und binary-semaphores.

Zusammenfassung,

Absicht

  • Mutex, gegenseitiger Ausschluss
  • Semaphore, implementieren parallele Entwurfsmuster

Verhalten

  • mutex, nur der/die zugelassene(n) Agent(en) betritt(en) den kritischen Abschnitt und nur er(sie) kann/können ihn verlassen
  • Semaphore, eingeben, wenn die Flagge Los sagt, andernfalls warten, bis jemand die Flagge ändert

Aus gestalterischer Sicht mutex ist eher so state-pattern wobei der vom Zustand ausgewählte Algorithmus den Zustand ändern kann. Das binary-semaphore ist eher so strategy-pattern bei dem die externer Algorithmus kann den Zustand und schließlich den Algorithmus/die Strategie ändern, der bzw. die zur Ausführung ausgewählt wurde.

Benutzeravatar der Community
Gemeinschaft

In diesen beiden Artikeln werden großartige Details erläutert mutex vs Semaphoren
Auch diese Stapelüberlaufantwort sagt die ähnliche Antwort.

Benutzeravatar von ajinkya
ajinkya

Semaphore wird eher als Flag verwendet, für das Sie wirklich kein RTOS / OS mitbringen müssen. Semaphore kann versehentlich oder absichtlich von anderen Threads geändert werden (z. B. aufgrund schlechter Codierung). Wenn Sie Mutex verwenden, besitzt es die Ressourcen. Kein anderer Thread kann jemals darauf zugreifen, bevor die Ressource frei wird.

1418420cookie-checkpthreads mutex gegen semaphor

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy