Frage

Dies ist in erster Linie um das Verständnis des Konzepts, das mich verwirrt.

Mutex bedeutet, dass ein Faden nimmt die Steuerung des Zugangs von gemeinsam genutzten Ressource, führen Operationen durch und öffnet es, nur dann Zugang zu anderem Thread Sperre erlangen kann

, während Binärsemaphore wie ein roter Faden ist der Zugriff auf die gemeinsam genutzte Ressource gewinnen können, aber den Zugang zum Schloss, während ein anderer Thread es entsperren

In der letzten Frage, die ich sah hier erwähnt wurde dass "semaphores are more suitable for some synchronization problems like producer-consumer".

Meine Frage , zum Beispiel, wenn Produzent Thread hat gewonnen Sperre und eine Warteschlange mit Daten füllen, und die Verbraucher zugleich Unlocks es ist nicht es ein Parallelität Problem ??

War es hilfreich?

Lösung

Ich werde versuchen, die Verwirrung zu klären, so gut ich kann. Ich werde die Konzepte den Weg erklären sie traditionell definiert sind. Das Problem ist, dass die Menschen beginnen, die Bedeutung vieler dieser Konzepte zu mischen und eine Menge Verwirrung aus, die entstehen.

Jedes Mal, wenn wir ein Stück Code, dass ändert ein wenig Speicher (sagt eine Variable), die wir zwischen verschiedenen Prozessen oder Threads gemeinsam genutzt wird, haben einen kritischen Abschnitt . Wenn wir dieses Stück Code nicht darauf achten, richtig zu synchronisieren, dann werden wir Fehler bekommen. Ein Beispiel für einen kritischen Abschnitt ist ein Hersteller des Hinzufügen eines Elements zu einem gemeinsamen Behälter von einer Art.

Eine Möglichkeit, kritische Abschnitte zu synchronisieren ist mutual exclusion zu erzwingen . Mutual exclusion bedeutet, dass nur ein Prozess oder Thread kann zu einem Zeitpunkt in den kritischen Abschnitt und Zugriff auf den gemeinsamen Teil des Speichers auszuführen. Beachten Sie, dass die gegenseitige Ausgrenzung ist kein Mechanismus in ihm selbst, es ist ein Prinzip, das wir mit anderen Mitteln durchsetzen können. Einige Leute sprechen über Sperren und binäre Semaphore als mutexes sondern dass mischt die Konzepte in einer Weise, die zu Verwirrung führen wird.

Binärsemaphore ist eine Möglichkeit, gegenseitigen Ausschluss zu erzwingen. Jedes Mal, wenn ein Prozess will Zugriff auf den Mutex erhalten kann es das Semaphor erwerben. Dieser Vorgang wird blockiert, wenn ein anderer Prozess ist in diesem Moment die Semaphore halten. Daher wir mutual exclusion haben. Sobald ein Prozess mit dem Mutex erfolgt dann löst man die Semaphore andere Prozesse in den Mutex zu lassen. Auf diese Weise können wir gegenseitigen Ausschluß mit einer binären Semaphore erreichen, aber es ist keineswegs die einzig mögliche Anwendung eines binären Semaphore.

Semaphore sind schön für Erzeuger-Verbraucher-Probleme, weil sie eine beliebige natürliche Zahl annehmen können, nicht nur 0 und 1 im Fall von binären Semaphore. Dies ist sehr nützlich, wenn Erzeuger-Verbraucher-Probleme zu synchronisieren, weil Sie den Wert eines Semaphors enthalten die Anzahl der verfügbaren Elemente lassen können. Wenn die Anzahl der Elemente auf Null sinkt dann die Semaphoroperationen automatisch blockiert werden.

Ich weiß, die Erklärung des Erzeuger-Verbraucher-Problem ist ein bisschen kurz, und ich ermutige Sie Lösungen zu suchen, die Semaphore verwendet und auch diese Lösungen zu anderen Lösungen zu vergleichen, die andere Synchronisation verwendet Konstrukte wie Monitore oder Message-Passing. Ich habe es gefunden werden, sehr aufschlussreich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top