Un lock primitivo è una primitiva di sincronizzazione che non è posseduta da nessun particolare thread quando è bloccata. In Python, al momento è la primitiva di sincronizzazione di più basso livello disponibile, implementata direttamente dal modulo di estensione thread.
Un lock primitivo si trova in uno dei due stati, ``bloccato'' o ``sbloccato''. Viene creato nello stato sbloccato. Possiede due metodi di base, acquire() e release(). Quando lo stato è sbloccato. acquire() modifica lo stato a bloccato, e restituisce immediatamente. Quando lo stato è bloccato, acquire() si blocca fino che la chiamata release() in un altro thread lo modifichi a sbloccato, quindi la chiamata a acquire() lo reimposta in modo bloccato e restituisce. Il metodo release() dovrebbe essere chiamato solo nello stato bloccato; modifica lo stato in sbloccato e restituisce immediatamente. Quando più di un thread è bloccato in acquire(), in attesa che lo stato venga cambiato in sbloccato, solo un thread procede quando una chiamata a release() reimposta lo stato a sbloccato; quale dei thread in attesa procederà in seguito non è definito, e può variare a seconda dell'implementazione.
Tutti i metodi sono eseguiti atomicamente.
[blocking = 1 ]) |
Quando viene invocato senza argomenti, si blocca fino a che il lock è sbloccato, quindi lo blocca e restituisce. Non c'è alcun valore restituito in questo caso.
Quando viene invocato con l'argomento blocking impostato a vero, esegue le stesse cose di quando viene chiamato senza argomenti, e restituisce vero.
Quando viene invocato con l'argomento blocking impostato a falso, non si blocca. Se una chiamata senza un argomento si bloccherebbe, restituisce falso immediatamente; altrimenti, esegue le stesse azioni di quando viene chiamato senza argomenti, e restituisce vero.
) |
Quando un lock è bloccato, lo reimposta come sbloccato, e restituisce. Se qualunque altro thread è bloccato in attesa che il lock si sblocchi, permette solo a uno di loro di procedere.
Non chiamare questo metodo quando il lock è sbloccato.
Non esiste valore di ritorno.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.