Angenommen, wir haben einen Semaphor s und es warten mehrere Threads darauf, indem wir P (s) aufrufen. Dann würde V (s) genau einen Thread unter ihnen aufwecken. Gibt es eine Möglichkeit, einen bestimmten Thread aufzuwecken, anstatt dass das System die Entscheidung trifft? Zum Beispiel möchte der Barbier in dem Barbershop-Problem nach jedem Haarschnitt den längsten wartenden Kunden anstelle eines zufälligen Kunden bedienen.Wie benutzt man V, um ein bestimmtes P aufzuwecken?
Antwort
Sie könnten einfach eine Warteschlange verwenden, um die Ps zu speichern. Das wird Sie basierend auf der längsten Wartezeit machen lassen. Wenn nicht, könnten Sie in einem sortierten Baum basierend auf dem von Ihnen gewünschten Parameter speichern und bei Bedarf entfernen.
Ich denke, der Kern davon wäre eine Art Bestellmechanismus für die P's, die nicht zu kompliziert sein sollte.
Es hängt von der Implementierung des Semaphors ab. Sie müssen einen intelligenten Semaphor verwenden, der eine Warteschlange mit wartenden Threads erstellt und sie in der richtigen Reihenfolge signalisiert. Ich denke, die normale Semaphor-Implementierung unter Windows funktioniert nicht so. Es sendet nur ein Signal an das Betriebssystem, das wiederum ein Signal an einen der wartenden Threads sendet. Es wäre sogar sinnvoll, einen Lifo-Stack zu verwenden, da dies einfacher implementiert wird. Aber es wäre nicht schwer, dies selbst zu erstellen, indem Sie eine Warteschlange implementieren, die eine verknüpfte Liste oder ein zyklisches Array sein könnte.
Nein, nicht mit klassischen Semaphoren allein. Wenn Sie ein warteschlangenähnliches Verhalten wünschen, erstellen Sie eine Warteschlange (mit einem Semaphor oder vielleicht einigen davon), um die gemeinsam genutzten Datenstrukturen der Warteschlange zu schützen.
Die Realität ist, dass, während Semaphoren theoretisch alles sind, was Sie für die Synchronisation benötigen, würden Sie selten (nie?) Einen signifikanten Körper von echtem Code schreiben, der nur leere Semaphore direkt verwendet. Die meiste Zeit bauen Sie Konstrukte höherer Ebene mit (zum Beispiel) einem Semaphor, um diese kritischen Daten in diesem Konstrukt zu schützen.
Das 'sprachagnotische' Tag ignorieren:' java.util.concurrent.Semaphore' hat 'fairNess', was First-In-First-Out garantiert. Aber das ist keine Antwort, da die Bezeichnung auf einem anderen Parameter liegen kann. – khachik