7.5.2 Oggetti RLock

Un lock rientrante è una primitiva di sincronizzazione che può essere acquisita più volte dallo stesso thread. Internamente, utilizza il concetto di ``thread proprietario'' e ``livello di ricorsione'' in aggiunta agli stati bloccato/sbloccato usate dai lock primitivi. Nello stato bloccato, alcuni thread possiedono il lock; nello stato sbloccato, esso non è posseduto da alcun thread.

Per bloccare il lock, un thread chiama il suo metodo acquire(); questi restituisce una volta il thread proprietario del lock. Per sbloccare il lock, un thread chiama il suo metodo release(). La coppia di chiamate acquire()/release() può essere nidificata; solo la chiamata finale a release() (la release() della coppia più esterna) reimposta il lock a sbloccato e permette ad un altro thread bloccato in acquire() a procedere.

acquire( [blocking = 1])
Acquisisce il lock, bloccante o non bloccante.

Quando viene invocato senza argomenti: se questo thread possiede già il lock, incrementa il livello di ricorsione di uno, e restituisce immediatamente. Altrimenti, se un altro thread possiede il lock, si blocca fino a che il lock non venga sbloccato. Una volta che il lock è sbloccato (non posseduto da alcun thread), ne ottiene la proprietà, ne imposta il valore di ricorsione ad uno e ritorna. Se più di un thread è bloccato in attesa dello sblocco del lock, solo un thread allo volta potrà ottenere il possesso del lock. Non viene restituito alcun valore in questo caso.

Quando viene invocata con l'argomento blocking impostato a vero, esegue le stesse azioni di quando viene chiamata senza argomenti, e restituisce vero.

Quando viene invocata con l'argomento blocking impostato a falso, non si blocca. Se una chiamata senza un argomento si bloccherebbe, restituisce falso immediatamente; altrimenti, fa le stesse azioni di quando viene chiamata senza argomenti, e restituisce vero.

release( )
Rilascia il lock, decrementando il livello di ricorsione. Se, dopo il decremento, è zero, reimposta il lock a sbloccato (non posseduto da alcun thread), e se ogni altro thread è bloccato in attesa che il lock si sblocchi, permette esattamente a uno di loro a procedere. Se dopo il decremento il livello di ricorsione è ancora diverso da zero, il lock rimane bloccato e posseduto dal thread chiamante.

Chiamate questo metodo solo quando il thread chiamante possiede il lock. Non chiamate questo metodo quando il lock è sbloccato.

Non c'è alcun valore restituito.

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.