una forma común es si ha anidado cerraduras que no son adquiridos en el mismo orden . El subproceso 1 podría adquirir el bloqueo A y el subproceso 2 podría adquirir el bloqueo B y bloquearían.
var a = new object();
var b = new object();
lock(a) {
lock(b) {
}
}
// other thread
lock (b) {
lock(a) {
}
}
editar: ejemplo no bloqueado .. using waithandles. Supongamos que Sócrates y Descartes están comiendo filetes y que ambos, siendo filósofos bien educados, necesitan un tenedor y un cuchillo para poder comer. Sin embargo, solo tienen un juego de cubiertos, por lo que es posible que cada uno agarre un utensilio y luego espere por siempre a que el otro le entregue el utensilio.
Véase el Dining Philosopher's Problem
WaitHandle fork = new AutoResetEvent(), knife = new AutoResetEvent();
while(Socrates.IsHungry) {
fork.WaitOne();
knife.WaitOne();
Eat();
fork.Set();
knife.Set();
}
// other thread
while(Descartes.IsHungry) {
knife.WaitOne();
fork.WaitOne();
Eat();
knife.Set();
fork.Set();
}
@DotNetBeginner: no existe tal cosa como C# .NET. –
Muchas gracias por corregirme: D – DotNetBeginner