Ho la seguente situazione: Voglio escludere reciprocamente l'accesso a un oggetto.È possibile bloccare e monitorare lo stesso oggetto in modo sicuro?
Finora ho normalmente sarebbe utilizzare un oggetto di blocco
object lockObject = new object();
...
method1: lock(lockObject) { CODE1 }
Ora ho anche un metodo che può essere chiamato da un altro thread. Non dovrebbe essere bloccato per un tempo sconosciuto, invece dovrebbe dare una risposta in un tempo definito.
In questo caso vorrei usare un monitor, come
method2:
try{
Monitor.TryEnter(lockObject , 20000, ref lockTaken);
if (lockTaken) {CODE2}
}
catch(...){...}
finally
{
if (lockTaken) Monitor.Exit(timerLock);
}
Ora la mia domanda è: può bloccare e monitorare essere mescolati in modo tale se il LockObject è lo stesso ed escludere a vicenda, o se è necessario cambiare ogni blocco su un monitor.
Quindi entrambe le volte lo stesso token deve essere "bloccato" oppure il monitor crea un altro token per l'oggetto e quindi il lucchetto?
In un colpo d'occhio non riesco a vedere che l'applicazione venga eseguita in codice di entrambi allo stesso tempo. Ma non so se possono esistere problemi di temporizzazione, dove CODE1 e CODE2 sono eseguiti in parallelo.
sento il tuo dolore; Spesso mi auguro che la parola chiave 'lock' abbia preso un timeout in qualche modo –