GNU/Linux >> LINUX-Kenntnisse >  >> Linux

pthreads mutex gegen semaphor

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 wird sowohl die Erfassung als auch die Freigabe von demselben gehandhabt.


Ich werde über Mutex vs. Binary-Semaphore sprechen. Offensichtlich verwenden Sie 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 derselbe Thread-Code ist, der auf einer anderen Thread-Instanz ausgeführt wird, die Sperre trifft, dann 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“.


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, Semaphor 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


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.


Linux
  1. Wie Linux langsame Computer (und den Planeten) rettet

  2. Welche Unix-Befehle können als Semaphor/Sperre verwendet werden?

  3. So ändern Sie Kernel-Semaphor-Limits in CentOS/RHEL

  4. Was ist der Unterschied zwischen Mutex und kritischem Abschnitt?

  5. Wie kann ich ein Semaphor wiederherstellen, wenn der Prozess, der es auf Null dekrementiert hat, abstürzt?

So verwenden Sie Beispiele für C-Mutex-Sperren für die Linux-Thread-Synchronisierung

Spinlock versus Semaphore

Pthread-Mutex-Assertion-Fehler

pthreads mutex gegen semaphor

Systemweiter Mutex in Python unter Linux

Wie behauptet man, ob ein std::mutex gesperrt ist?