Dokumentation
IPS_SemaphoreEnter
boolean IPS_SemaphoreEnter (string $Name, int $Wartezeit)
Parameterliste
Name | Name, der die Semaphore beschreibt |
Wartezeit | Millisekunden, die gewartet wird, bis die Funktion abbricht |
Rückgabewert
TRUE, wenn die Semaphore betreten wurde. FALSE, wenn die Semaphore vor Ablauf der Wartezeit nicht betreten werden konnte
Beschreibung
Diese Funktion setzt ein Semaphor (ein Zeichen mit Signalwirkung), das dazu verwendet werden kann, einen Teil des Skriptes exklusiv auszuführen und diesen vor konkurrierenden Skripten zu schützen.
In IP-Symcon können grundsätzlich mehrere Skripte gleichzeitig laufen. Solange ein Skript keinen exklusiven Zugriff auf Variablen oder System-Ressourcen benötigt, stellt dieser Fall kein Problem dar. Falls aber ein exklusiver Zugriff unumgänglich ist, kann mit der Funktion ein Semaphor gesetzt werden. Die Funktion prüft zuerst, ob das Semaphor mit dem angegebenen Namen bereits gesetzt ist. Existiert es noch nicht, wird es durch die Funktion gesetzt und liefert TRUE als Rückmeldung. Alle anderen Skripte, die danach versuchen das selbe Semaphor zu setzen, versuchen für die Dauer Wartezeit weiterhin das Semaphor zu setzen. Ist es dabei erfolgreich, wird TRUE zurückgemeldet, andernfalls, nach Ablauf der Wartezeit, FALSE.
Wenn man gewährleisten will, dass während der Laufzeit eines Skripts die von ihm verwendeten Daten nicht von anderen, gleichzeitig laufenden Skripten verfälscht werden, kann man diese Funktion verwenden, um sich exklusiven Zugriff zu sichern.
Bei der Verwendung dieser Funktion ist darauf zu achten, dass das Semaphor nach Abarbeiten des kritischen Teils wieder mit IPS_SemaphoreLeave zurückgesetzt wird.
Beispiel
if (IPS_SemaphoreEnter("KritischerPunkt", 1000))
{
// ...Kritischer Codeabschnitt
//Semaphore wieder freigeben!
IPS_SemaphoreLeave("KritischerPunkt");
}
else
{
// ...Keine ausführung Möglich. Ein anderes Skript nutzt den "KritischenPunkt"
// für länger als 1 Sekunde, sodass unsere Wartezeit überschritten wird.
}