OggettoSemaforo
oggetto semaforo in fibra
L'oggetto semaforo gestisce un contatore interno, che viene decrementato di uno dopo la chiamata acquire o wait, e incrementato di uno dopo la chiamata release o post. Il contatore non diminuirà fino a un numero negativo, perché quando l'acquisizione e l'attesa rilevano che il valore è 0, metteranno in pausa la fibra corrente finché altre fibre non aumenteranno il valore del contatore tramite rilascio o post.
Le occasioni comunemente usate per i semafori sono limitare l'uso simultaneo delle risorse e l'applicazione del modello produttore/consumatore.
Prendiamo come esempio le richieste del database per limitare l'uso simultaneo delle risorse:
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();
Il modello produttore/consumatore solitamente utilizza semafori con code. Il produttore aggiunge dati alla coda e invia un segnale. Il consumatore prima attende il segnale, riceve il segnale e poi va in coda per interrogare i dati.
rapporto ereditario
Costruttore
Semaphore
costruttore del semaforo
1new Semaphore(Integer value = 1);
Parametri di chiamata:
- value: Intero, valore iniziale del contatore
funzione membro
wait
aspettare un semaforo
1Boolean Semaphore.wait(Integer timeout = -1);
Parametri di chiamata:
- timeout: Numero intero, specifica il timeout in millisecondi. Il valore predefinito è -1, il che significa che non scadrà mai.
Risultati restituiti:
- Boolean, restituisce true se l'acquisizione ha esito positivo, restituisce false se scade.
post
Rilascia un semaforo, equivalente a release()
1Semaphore.post();
trywait
Prova ad acquisire un segnale, se non può essere acquisito, restituirà immediatamente e restituirà false, che equivale ad acquire(false)
1Boolean Semaphore.trywait();
Risultati restituiti:
- Boolean, restituisce true se l'acquisizione ha esito positivo, restituisce false se scade.
acquire
Ottieni la proprietà della serratura
1Boolean Semaphore.acquire(Boolean blocking = true);
Parametri di chiamata:
- blocking: Booleano, specifica se attendere, attendere quando vero, il valore predefinito è vero
Risultati restituiti:
- Boolean, restituisce se il blocco è stato acquisito con successo, true indica l'acquisizione riuscita.
Il metodo acquire viene utilizzato per ottenere la proprietà del blocco. Quando il blocco è nello stato acquisibile, questo metodo restituisce immediatamente true.
Quando il blocco non può essere acquisito e il blocco è vero, la fibra corrente va in modalità sospensione. Quando altre fibre rilasciano il blocco, questo metodo restituisce vero.
Quando il blocco non può essere acquisito e il blocco è false, il metodo restituisce false.
release
Rilascia la proprietà della serratura
1Semaphore.release();
Questo metodo rilascerà la proprietà del blocco o genererà un errore se la fibra corrente non possiede il blocco.
count
Interroga il numero corrente di attività in attesa
1Integer Semaphore.count();
Risultati restituiti:
- Integer, restituisce il numero di attività
toString
Restituisce la rappresentazione in formato stringa dell'oggetto. Generalmente viene restituito "[Oggetto nativo]". L'oggetto può essere reimplementato in base alle proprie caratteristiche.
1String Semaphore.toString();
Risultati restituiti:
- String, restituisce la rappresentazione di stringa dell'oggetto
toJSON
Restituisce una rappresentazione in formato JSON dell'oggetto, generalmente restituendo una raccolta di proprietà leggibili definite dall'oggetto.
1Value Semaphore.toJSON(String key = "");
Parametri di chiamata:
- key: Stringa, non utilizzata
Risultati restituiti:
- Value, restituisce un valore contenente JSON serializzabile