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.