4D v16.3

Über Semaphoren

Home

 
4D v16.3
Über Semaphoren

Über Semaphoren  


 

In einem Computerprogramm ist eine Semaphore ein Tool zum Schutz von Aktionen, die nur von einem Prozess oder einem Benutzer zur selben Zeit ausgeführt werden dürfen.

In 4D sind Semaphoren beispielsweise beim Ändern eines Interprozess Arrays notwendig: Ändert ein Prozess die Werte des Array, darf kein anderer Prozess die Möglichkeit haben, zum gleichen Zeitpunkt dasselbe zu tun. Der Entwickler verwendet eine Semaphore, um einem Prozess anzuzeigen, dass er die Operationen nur ausführen kann, wenn kein anderer Prozess gerade dieselben Aktionen ausführt. Stößt ein Prozess auf eine Semaphore, gibt es drei Möglichkeiten:

  • Er erhält sofort das Recht zur Ausführung
  • Er wartet, bis er an der Reihe ist und das Recht zur Ausführung erhält
  • Er setzt seinen Weg fort und verwirft die Idee, diese Aufgaben auszuführen

Die Semaphore schützt also Teile des Code. Sie erlaubt nur einen Prozess zur selben Zeit und blockiert den Zugriff, bis der aktuell berechtigte Prozess seinen Vorrang durch Freigabe der Semaphore beendet.

In 4D setzen Sie eine Semaphore durch Aufrufen der Funktion Semaphore. Um sie wieder freizugeben, rufen Sie den Befehl CLEAR SEMAPHORE auf.

Die Funktion Semaphore hat ein sehr spezielles Verhalten, da sie zwei Aktionen gleichzeitig durchführt:

  • Ist die Semaphore bereits zugewiesen, gibt die Funktion Wahr zurück
  • Ist die Semaphore nicht zugewiesen, weist die Funktion sie dem Prozess zu und gibt zur gleichen Zeit Falsch zurück.

Diese Doppelaktion derselben Funktion stellt sicher, dass zwischen Testen und Zuweisen der Semaphore keine externe Operation eingefügt werden kann.

Über die Funktion Test semaphore können Sie herausfinden, ob eine Semaphore bereits zugewiesen ist oder nicht. Sie wird hauptsächlich als Teil von langen Operationen verwendet, wie z.B. beim Jahresabschluss in der Buchhaltung. Hier steuert Test semaphore die Oberfläche und verhindert den Zugriff zu bestimmten Operationen, wie z.B. Rechnungsdaten hinzufügen.

Für Semaphoren gelten folgende Prinzipien:

  • Eine Semaphore soll in der gleichen Methode gesetzt und freigegeben werden
  • Die Ausführung von Code, der durch eine Semaphore geschützt ist, soll so kurz wie möglich sein
  • Der Code soll über den Parameter tickCount der Funktion Semaphore getaktet sein, um die Auflösung der Semaphore abzuwarten.

Hier ein typischer Code für eine Semaphore:

 While(Semaphore("MySemaphore";300))
    IDLE
 End while
  // hier durch Semaphore geschützten Code setzen
 CLEAR SEMAPHORE("MySemaphore")

Eine nicht aufgelöste Semaphore kann Teile der Anwendung blockieren. Dieses Risiko lässt sich ausschließen, wenn Sie Semaphoren in derselben Methode setzen und auflösen.

Minimieren von Code, der durch eine Semaphore geschützt ist, erhöht die Durchlässigkeit der Anwendung und verhindert, dass die Semaphore wie ein Flaschenhals wirkt.

Zu guter Letzt optimiert der optionale Parameter tickCount der Funktion Semaphore das Abwarten bis zur Freigabe der Semaphore. Mit diesem Parameter funktioniert der Befehl wie folgt:

  • Der Prozess wartet das Maximum der angegebenen Zahl Ticks (300 im Beispiel) für die gesetzte Semaphore ab, bis die Code Ausführung zur nächsten Zeile übergeht.
  • Wird die Semaphore vor Ende dieses Limits aufgelöst, wird das sofort dem Prozess zugewiesen (Semaphore gibt Falsch zurück) und die Code Ausführung wird fortgesetzt.
  • Wird die Semaphore erst mit Ende dieses Limits aufgelöst, wird die Code Ausführung dann fortgesetzt.

Die Funktion zieht auch Anfragen durch Einrichten einer Schleife vor. Auf diese Weise erhält der erste Prozess, der eine Semaphore abfragt, auch als erster eine.

Beachten Sie, dass die Wartezeit gemäß den Eigenheiten der Anwendung gesetzt wird.

Es gibt zwei Arten von Semaphoren:

  • Lokale Semaphoren werden nur von den Prozessen auf derselben Arbeitsstation und nur von dieser erkannt. Sie werden mit einem vorangestellten Dollarzeichen gekennzeichnet, z.B. $MeineSemaphore. Mit lokalen Semaphoren steuern Sie Operationen zwischen Prozessen, die auf einer Arbeitsstation ausgeführt werden. Eine lokale Semaphore kann z.B. den Zugriff auf ein Interprozess-Array steuern, das sich alle Prozesse einer Arbeitsstation oder im 4D Einzelplatzbetrieb teilen.
  • Globale Semaphoren sind für alle Benutzer und für alle Prozesse zugänglich. Mit globalen Semaphoren verwalten Sie Operationen zwischen Benutzern einer Datenbank im Mehrplatzbetrieb.

Globale und lokale Semaphoren funktionieren nach derselben Logik. Der Unterschied liegt in ihrer Reichweite. Im Client/Server Modus werden globale Semaphoren von allen Prozessen auf allen Clients und Servern gemeinsam genutzt. Eine lokale Semaphore wird nur von Prozessen auf dem Rechner genutzt, wo sie erzeugt wurde.
In 4D haben globale und lokale Semaphoren dieselbe Reichweite, da es nur einen Benutzer gibt. Wird die Datenbank jedoch in beiden Setups verwendet, stellen Sie sicher, dass - je nachdem, was ausgeführt werden soll - globale oder lokale Semaphoren verwendet werden.

Hinweis: Wir empfehlen, zum Verwalten lokaler Aspekte für den Client einer Anwendung, wie z.B. die Oberfläche oder ein Array mit Interprozessvariablen, lokale Semaphoren zu verwenden. Verwenden Sie dafür globale Semaphoren, verursacht das nicht nur unnötigen Austausch über das Netzwerk, sondern kann auch andere Client-Rechner beeinträchtigen. Über eine lokale Semaphore können Sie solche unerwünschten Nebenwirkungen vermeiden.



Siehe auch 


CLEAR SEMAPHORE
Semaphore
Über Worker

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Prozess (Kommunikation)

 
GESCHICHTE 

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v16)
4D Programmiersprache ( 4D v16.1)
4D Programmiersprache ( 4D v16.2)
4D Programmiersprache ( 4D v16.3)