Unterschied zwischen einer mutex und semaphor - intra-Prozess und inter-Prozess
Lesen der verschiedenen Beiträge auf SO auf Unterschiede zwischen den beiden (mutex und semaphore) komme ich zum folgenden Schluss bitte korrigieren Sie mich, wenn ich falsch bin.Dies ist vor allem im Zusammenhang mit windows. Ich verstehe, dass kritische Abschnitte sind Abschnitte in einem code, die geschützt werden müssen (ich.e) kann nicht zugegriffen werden, die von mehreren threads zur gleichen Zeit. Nun, um jene zu schützen, die kritische Abschnitte Mutexe verwendet werden. Diese Mutexe können entweder algorithmen oder Datenstrukturen. Jetzt Mutexe können in der Regel in zwei Geschmacksrichtungen (intra-Prozess und inter-Prozess) . Für die intra-Prozess, in dem keine Aufrufe an den kernel für die Verriegelung vorgenommen werden, könnten wir Boost-Thread synchronisierungsprimitiven wie lock_guard
, unique_lock
, shared_lock
(single writer/multiple readers) und für die inter-Prozess, den wir nutzen könnten Boost Interprozesskommunikation semaphore.Nun sind diese inter-Prozess-Mutexe sind grundsätzlich als semaphore. Der Grund, warum ich geschlossen, dass
da war diese post, die besagt
Semaphor-Signalisierung Mechanismus ("ich bin fertig, können Sie auf" Art
des Signals). Zum Beispiel, wenn Sie songs hören (nehme an, es als eine
tasks) auf Ihrem Handy und in der gleichen Zeit, die dein Freund dir genannt, ein
interrupt wird ausgelöst, bei denen eine interrupt-service-routine
(ISR) das signal für die call processing task-wakeup.
Erhöhung jetzt Interprozess-Staaten
.. Steigern.Interprozesskommunikation implementiert ähnliche Mechanismen zu synchronisieren
threads von verschiedenen Prozessen.
Bitte lassen Sie mich wissen, wenn mein Verständnis der semaphore ist in die richtige Richtung.
Nun eine andere definition von semaphore, die ich nicht verstehen kommt von hier
die ausgewählte Antwort-Staaten
Einer semaphore macht das gleiche wie ein mutex erlaubt aber x Anzahl der threads
geben Sie.
Die korrekt beschreibt, was ein semaphor hat ? Es tut ermöglichen Inter-Prozess-Ressourcen-Schutz oder muss es erlauben, eine bestimmte Anzahl von threads auf eine Ressource zugreifen ? Wenn es die zweite wäre es nicht zu einer Beschädigung der Ressource, da mehrere threads greifen auf Sie zu.
- in windows wird ein semaphor ist ein Event finden Sie unter CreateEvent
- Eine gute Erklärung finden Sie hier: koti.mbnet.fi/niclasw/MutexSemaphore.html Fazit: Ein mutex ist eine sempahore mit dem Wert 1. Im Grunde ist es egal, ob eine Ressource zugegriffen wird, die von mehreren threads oder mehreren Prozessen. Gibt es Unterschiede beim Zugriff auf den Speicher, aber das ist ein anderes Thema.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine semaphore ist ein Synchronisations-Mechanismus bauen um einen integer-Wert. Sperren eines semaphors (in der Regel als "warten auf semaphore"), verringert sich der Wert, es sei denn, es ist 0. In diesem Fall wird der thread angehalten, bis der semaphor-Wert ist größer als 0, so kann es richtig verringert. Die Erschließung des semaphor (in der Regel als "Buchung" oder "melden"), erhöht den Wert um 1, bedingungslos.
In der Regel beim erstellen eines semaphors, die Sie zuordnen müssen Sie einen Startwert. Wenn Sie einen Wert größer als 1, Sie können mehrere threads code eingeben "geschützt" durch eine semaphore.
Nun, ein mutex ist eine binäre Synchronisation primitiv. Konzeptionell kann es verglichen werden mit einem semaphor mit Anfangswert 1. Nur einen einzigen thread betreten kann code geschützt durch einen mutex.
Ich weiß nicht, die Windows-Welt, aber auf Unix-semaphore ist ein OS bauen, und es kann verwendet werden, um die Synchronisation mehrerer Prozesse. Pthread-Mutexe sind in der Regel verwendet für die Koordination der threads innerhalb eines einzigen Prozesses, aber es gibt tricks, die unter Verwendung von Mutexe für inter-Prozess-Synchronisation (shared-memory-block und spezielle Möglichkeiten zum erstellen eines mutex).
wait
hat eine--count_
undcondition_.wait()
wenn die Zählung 0 ist.signal()
hat eine bedingungslose++count_
undcondition_.notify_one()
aufzuwachen jeden thread wartet auf die bedingungsvariable.semaphore s(3);
), dann haben Sie Ihre code-block, umgeben vonwait
undsignal
:s.wait(); /* protected code */; s.signal()
.Mutex verwendet werden, in Fällen, wo es ist eine einzelne Objektinstanz(oder als OP genannten kritischen code-Abschnitt access), das muss synchronisiert werden. Beispiel: Einzelne Erzeuger-Verbraucher Zugriff auf eine queue - /Speicher-block. Wenn der Produzent hat derzeit mutex gesperrt. Der Verbraucher wird gesperrt(blockiert) verwenden, bis der Hersteller gibt Sie.
Semaphor wird verwendet in Fällen, in denen es mehrere Instanzen von gemeinsam genutzten Ressourcen. Also wenn eine neue Ressource Hinzugefügt wird, machen wir sem_post und wenn eine Ressource genommen oder verwendet sem_wait(Dekrement) . Wenn der count unter 0 sinkt, dass shm_wait blockiert werden würde. Dies ist ein Beispiel in system V.
Kommen wieder die Warteschlange zugreifen Beispiel oben für consumer-producer-Beispiel, es gibt vielleicht 4 KB zur Verfügung stehen und es möglich und um des Arguments Willen hier zu teilen Zugriff atomar zu 1 Kb, sagen wir. So semaphore kann erhöht werden, um 4, wenn alle 4KB vorhanden ist und 0, wenn keine vorhanden sind.