Objet objet intégré

Objet Sémaphore

Objet sémaphore fibre

L'objet sémaphore gère un compteur interne, qui diminue de un après avoir appelé acquis ou wait, et augmente de un après avoir appelé release ou post. Le compteur ne diminuera pas jusqu'à un nombre négatif, car l'acquisition et l'attente mettront en veille la fibre actuelle lorsqu'ils trouveront que la valeur est 0, jusqu'à ce que d'autres fibres augmentent la valeur du compteur via la libération ou la publication.

Les occasions courantes pour les sémaphores sont de limiter l'utilisation simultanée des ressources et l'application du modèle producteur/consommateur.

Prenons l'exemple des requêtes de base de données pour limiter l'utilisation simultanée des ressources :

1 2 3 4 5 6 7 8 9 10
var maxconnections = 5; var l = new coroutine.Semaphore(maxconnections); ...... l.acquire(); var conn = connectdb() ..... conn.close(); l.release();

Le modèle producteur/consommateur utilise généralement des sémaphores en conjonction avec des files d'attente. Le producteur ajoute des données à la file d'attente et publie un signal, et le consommateur attend d'abord le signal, obtient le signal, puis se rend dans la file d'attente pour interroger et récupérer les données.

Héritage

#lineWidth: 1.5 #font: Helvetica,sans-Serif #fontSize: 10 #leading: 1.6 #.this: fill=lightgray #.class: fill=white [<class>object|toString();toJSON()] [<class>Lock|new Lock()|acquire();release();count()] [<this>Semaphore|new Semaphore()|wait();post();trywait()] [object] <:- [Lock] [Lock] <:- [Semaphore] Lock new Lock() acquire() release() count() Semaphore new Semaphore() wait() post() trywait() object toString() toJSON()

Constructeur

Semaphore

Constructeur de sémaphore

1
new Semaphore(Integer value = 1);

Paramètres d'appel :

  • value: Entier, la valeur initiale du compteur

Fonction membre

wait

Attente d'un sémaphore, équivalent à acquérir (vrai)

1
Semaphore.wait();

post

Relâcher un sémaphore, ce qui équivaut à release()

1
Semaphore.post();

trywait

Essayez d'acquérir un signal. S'il ne peut pas être acquis, retournez immédiatement et retournez false, ce qui équivaut à acquérir (false)

1
Boolean Semaphore.trywait();

Résultat de retour :

  • Boolean, Renvoie vrai si l'acquisition est réussie

acquire

Acquérir la propriété de la serrure

1
Boolean Semaphore.acquire(Boolean blocking = true);

Paramètres d'appel :

  • blocking: booléen, spécifiez s'il faut attendre, si c'est vrai, attendez, la valeur par défaut est vraie

Résultat de retour :

  • Boolean, Renvoie si le verrou est acquis avec succès, true signifie que l'acquisition est réussie

La méthode d'acquisition est utilisée pour acquérir la propriété du verrou. Lorsque le verrou est dans un état pouvant être acquis, cette méthode renvoie true immédiatement.

Lorsque le verrou n'est pas disponible et que le blocage est vrai, la fibre actuelle se met en veille. Lorsque d'autres fibres libèrent le verrou, cette méthode renvoie vrai.

Lorsque le verrou n'est pas disponible et que le blocage est faux, la méthode renvoie faux.


release

Libérer la propriété du verrou

1
Semaphore.release();

Cette méthode libérera la propriété du verrou. Si la fibre actuelle ne possède pas le verrou, cette méthode générera une erreur.


count

Interroger le nombre de tâches actuellement en attente

1
Integer Semaphore.count();

Résultat de retour :

  • Integer, Renvoie le nombre de tâches

toString

Renvoie la représentation sous forme de chaîne de l'objet, renvoie généralement "[Objet natif]", l'objet peut être ré-implémenté selon ses propres caractéristiques

1
String Semaphore.toString();

Résultat de retour :

  • String, Renvoie la représentation sous forme de chaîne de l'objet

toJSON

Renvoie la représentation au format JSON de l'objet, renvoie généralement une collection d'attributs lisibles définis par l'objet

1
Value Semaphore.toJSON(String key = "");

Paramètres d'appel :

  • key: chaîne, inutilisé

Résultat de retour :

  • Value, Renvoie une valeur contenant JSON sérialisable