Semaphor

Semaphore können verwendet werden, um den Zugriff auf Ressourcen zu synchronisieren, die von einer festgelegten Anzahl von konkurrierenden Threads gemeinsam genutzt werden dürfen.

Ein Semaphor ist eine spezielle Art von Zähler. Der Zählerstand wird mit der Methode release erhöht, und mit der Methode aquire um Eins erniedrigt.

Ein durch ein Semaphor kontrollierter kritischer Bereich wird durch Einschliessen zwischen aquire und release geschützt. Der Bereich kann nur dann betreten werden, wenn der Zählerstand grösser als Null ist.

Die Veränderung des Zählerstands ist eine unteilbare Aktion. Wenn mehrere Threads konkurrierend auf den Semaphor zugreifen, werden die Methodenaufrufe von aquire und release synchronisiert, d.h. hintereinander ausgeführt.

Der Semaphor wird unter Angabe eines maximalen und eines anfänglichen Zählerstands erzeugt. Normalerweise wird der anfängliche Zählerstand auf das Maximum gesetzt. Dann lässt der Semaphor höchstens die als Maximum angegebene Zahl von Threads gleichzeitig in den anfangs leeren kritischen Bereich.

Die Methode aquire erniedrigt den Zählerstand. Der Zählerstand kann jedoch nicht unter Null fallen. Ist der Zählerstand Null und ein Thread ruft die Methode aquire auf, wird der Thread angehalten.

Ein Aufruf von release erhöht den Zählerstand, es sei denn, der maximale Zählerstand würde überschritten, oder es gibt einen oder mehrere wartende Threads. In diesem Fall wird der am längsten wartende Thread fortgesetzt und darf den kritischen Bereich betreten.

Ein bekanntes Beispiel für den Einsatz von Semaphoren ist das Problem der essenden Philosophen.