ObjectSemaphore
Faser-Semaphor-Objekt
Das Semaphorobjekt verwaltet einen internen Zähler, der nach dem Aufruf von „acquire“ oder „wait“ um eins dekrementiert und nach dem Aufruf von „release“ oder „post“ um eins erhöht wird. Der Zähler verringert sich nicht auf eine negative Zahl, da beim Erfassen und Warten festgestellt wird, dass der Wert 0 ist, wird die aktuelle Faser in den Ruhezustand versetzt, bis andere Fasern den Zählerwert durch Freigabe oder Post erhöhen.
Häufig genutzte Anlässe für Semaphoren sind die Begrenzung der gleichzeitigen Nutzung von Ressourcen und die Anwendung des Producer/Consumer-Modells.
Nehmen Sie als Beispiel Datenbankanforderungen, um die gleichzeitige Nutzung von Ressourcen einzuschränken:
1
2
3
4
5
6
7
8
9
10var maxconnections = 5;
var l = new coroutine.Semaphore(maxconnections);
......
l.acquire();
var conn = connectdb()
.....
conn.close();
l.release();
Das Producer/Consumer-Muster verwendet normalerweise Semaphore mit Warteschlangen. Der Produzent fügt der Warteschlange Daten hinzu und sendet ein Signal. Der Verbraucher wartet zuerst auf das Signal, erhält das Signal und geht dann zur Warteschlange, um die Daten abzufragen.
Erbschaftsverhältnis
Konstrukteur
Semaphore
Semaphor-Konstruktor
1new Semaphore(Integer value = 1);
Aufrufparameter:
- value: Ganzzahl, Anfangswert des Zählers
Mitgliedsfunktion
wait
warte auf ein Semaphor
1Boolean Semaphore.wait(Integer timeout = -1);
Aufrufparameter:
- timeout: Ganzzahl, gibt den Timeout in Millisekunden an. Der Standardwert ist -1, was bedeutet, dass es nie zu einem Timeout kommt.
Rückgabeergebnisse:
- Boolean, gibt „true“ zurück, wenn die Erfassung erfolgreich war, und gibt „false“ zurück, wenn das Zeitlimit überschritten wird.
post
Geben Sie ein Semaphor frei, äquivalent zu release()
1Semaphore.post();
trywait
Versuchen Sie, ein Signal zu erfassen. Wenn es nicht erfasst werden kann, wird es sofort zurückgegeben und gibt false zurück, was der Erfassung (false) entspricht.
1Boolean Semaphore.trywait();
Rückgabeergebnisse:
- Boolean, gibt „true“ zurück, wenn die Erfassung erfolgreich war, und gibt „false“ zurück, wenn das Zeitlimit überschritten wird.
acquire
Übernehmen Sie den Besitz des Schlosses
1Boolean Semaphore.acquire(Boolean blocking = true);
Aufrufparameter:
- blocking: Boolescher Wert, gibt an, ob gewartet werden soll. Warten, wenn wahr, der Standardwert ist wahr
Rückgabeergebnisse:
- Boolean, gibt zurück, ob die Sperre erfolgreich erworben wurde, true zeigt den erfolgreichen Erwerb an.
Die Acquire-Methode wird verwendet, um den Besitz der Sperre zu erlangen. Wenn sich die Sperre im erwerbbaren Zustand befindet, gibt diese Methode sofort „true“ zurück.
Wenn die Sperre nicht erworben werden kann und die Blockierung wahr ist, geht die aktuelle Faser in den Ruhezustand. Wenn andere Fasern die Sperre aufheben, gibt diese Methode „true“ zurück.
Wenn die Sperre nicht erworben werden kann und die Blockierung falsch ist, gibt die Methode „false“ zurück.
release
Geben Sie den Besitz des Schlosses frei
1Semaphore.release();
Diese Methode gibt den Besitz der Sperre frei oder löst einen Fehler aus, wenn die aktuelle Faser nicht Eigentümer der Sperre ist.
count
Fragen Sie die aktuelle Anzahl der wartenden Aufgaben ab
1Integer Semaphore.count();
Rückgabeergebnisse:
- Integer, gibt die Anzahl der Aufgaben zurück
toString
Gibt die Zeichenfolgendarstellung des Objekts zurück. Im Allgemeinen wird „[Native Object]“ zurückgegeben. Das Objekt kann gemäß seinen eigenen Eigenschaften neu implementiert werden.
1String Semaphore.toString();
Rückgabeergebnisse:
- String, gibt die Zeichenfolgendarstellung des Objekts zurück
toJSON
Gibt eine Darstellung des Objekts im JSON-Format zurück und gibt im Allgemeinen eine Sammlung lesbarer Eigenschaften zurück, die vom Objekt definiert werden.
1Value Semaphore.toJSON(String key = "");
Aufrufparameter:
- key: Zeichenfolge, nicht verwendet
Rückgabeergebnisse:
- Value, gibt einen Wert zurück, der JSON serialisierbar enthält