Ho una situazione in cui un blocco di codice deve essere eseguito solo se due oggetti locker sono liberi.Come utilizzare più variabili per un blocco Ambito in C#
Speravo ci sarebbe qualcosa di simile:
lock(a,b)
{
// this scope is in critical region
}
Tuttavia, sembra che ci sia niente di simile. Quindi vuol dire che l'unico modo per farlo è:
lock(a)
{
lock(b)
{
// this scope is in critical region
}
}
Funzionerà anche come previsto? Sebbene il codice compili, ma non sono sicuro che sarebbe in grado di raggiungere ciò che mi aspetto.
Non potrebbe causare problemi di blocco? diciamo che un oggetto blocca un, e un altro blocca b, ora avresti un deadlock in cui l'oggetto1 blocca un blocco di attesa b e object2 b in attesa di un. Non sono così familiare con le serrature, ma questo mi sembra brutto. – Tester101
Ecco perché l'ordine di blocco è importante, come tutte le risposte finora menzionate. A volte è necessario disporre di più blocchi e, in questi casi, uno dei modelli standard da utilizzare consiste nell'applicare (tramite convenzione almeno) un ordinamento sui blocchi. Ad esempio, dovresti dire ogni volta che vuoi ottenere il blocco b * devi * prima ottenere il blocco su a.Provoca più contesa, ma previene i deadlock. È sempre meglio evitare questo genere di cose quando possibile, ma a volte è necessario. – Herms
@ Tester101: Sì, sono consapevole che, se non gestito correttamente, causerà deadlock. –