esaminando i documenti di posix ' pthread_mutex_t
e window's mutex
e CRITICAL_SECTION
ho notato che non esiste un modo semplice per verificare se il thread corrente contiene un mutex specifico
posix ' pthread_mutex_t
può essere testato quando non è rientrante, ma è solo un artefatto di un mutex non rientranti
ofcourse che controlla se un altro thread contiene un mutex è banale con trylock
java consente di verificare se il thread corrente (e solo corrente) contiene un monitor oggetto con Thread.holdsLock(Object)
che è consigliabile utilizzare solo per il debug
allo stesso modo anche l'interfaccia di java.util.concurrent.locks.Lock
non fornisce alcun metodo di controllo (l'implementazione ReentrantLock
invece fa con ReentrantLock.isHeldByCurrentThread()
)
Posso immaginare che questo può essere facilmente implementato insieme a qualsiasi altro blocco (ed è anche richiesto quando si implementa un mutex rientrante)
tutto ciò che richiederebbe è un handle univoco per ogni thread (già disponibile nelle librerie di thread o potrebbe anche essere il puntatore TLS qualunque sia il più piccolo) e al massimo 2 campi aggiuntivi (uno per l'handle e uno per il holdcount)
-
durante il blocco: una volta acquisito il blocco, incrementa il holdcount e imposta l'handle sull'impugnatura thread corrente
-
durante lo sblocco: prima di sbloccare decrementa il holdcount e imposta l'handle su zero solo quando il holdcount è ora 0
-
durante il test: ottieni l'handle e confrontalo con l'handle del thread corrente
questo può essere possibile senza alcuna membrana purché una scrittura simultanea non manipoli i bit della lettura in modo tale che venga letta una maniglia che non è stata scritta (cioè la maniglia del thread di lettura)
le uniche condizioni di gara possibili sono in # 3 (il resto accade quando il blocco è trattenuto) e potrebbero essere irrilevanti a seconda del modello di memoria data la dimensione del valore letto (una parola) ( modifica : se viene utilizzato uno schema di lettura / scrittura atomico, questo viene persino risolto completamente)
il holdcount non è nemmeno necessario quando il mutex non è rientrante e non lo stai facendo rientrare
EDIT2 : voglio chiarire che hasLock
sarebbe usato solo a scopo di debug (asserisce) per esempio per garantire che un metodo che ha bisogno di un blocco tenuto dal chiamante lo abbia effettivamente
per quanto riguarda la condizione della gara è irrilevante:
- il primo requisito è che hai bisogno di un modo per scrivere e leggere contemporaneamente in modo da ottenere solo i valori che sono stati effettivamente scritti
- secondo il test
handle == currentHandle
tratterà sianil
che l'handle di un altro thread allo stesso modo - l'unico modo che currentHandle equivale a gestire è quando il thread corrente lo ha scritto durante il blocco