Created
September 26, 2014 01:41
-
-
Save Fhernd/9cdf35c21f62a0fc1b2f to your computer and use it in GitHub Desktop.
Demostración de bloqueo mutuo.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Threading; | |
namespace Recetas.Multithreading.R0202 | |
{ | |
public sealed class BloqueoMutuo | |
{ | |
public static void Main() | |
{ | |
Console.Title = "=== Demostración Bloqueo Mutuo ==="; | |
Console.WriteLine (); | |
// Instancias de `Object` para bloqueo de regiones críticas: | |
object bloqueo1 = new object(); | |
object bloqueo2 = new object(); | |
// Creación de un objeto `Thread` para iniciar el método | |
// `Bloquear`: | |
new Thread (() => Bloquear(bloqueo1, bloqueo2)).Start(); | |
// Intento casi simultáneo de región crítica con el objeto | |
// `bloqueo2`: | |
lock (bloqueo2) | |
{ | |
// Espera durante un segundo: | |
Thread.Sleep (1000); | |
Console.WriteLine ("La invocación del método `Monitor.TryEnter` evita el bloqueo " + | |
"de la aplicación, en caso de no liberarse el recurso solicitado se esperan " + | |
"5 segundos" | |
); | |
if (Monitor.TryEnter (bloqueo1, TimeSpan.FromSeconds (5))) | |
{ | |
Console.WriteLine ("Acceso satisfactorio a recurso protegido."); | |
} | |
else | |
{ | |
Console.WriteLine ("El tiempo de espera se superó."); | |
} | |
} | |
// Creación de un nuevo objeto `Thread` para invocar nuevamente | |
// el método `Bloquear`: | |
new Thread (() => Bloquear (bloqueo1, bloqueo2)).Start(); | |
Console.WriteLine ("\n----------------------------------"); | |
lock (bloqueo2) | |
{ | |
Console.WriteLine ("Aquí ocurre un bloqueo mutuo (deadlock)."); | |
Thread.Sleep (1000); | |
lock (bloqueo1) | |
{ | |
Console.WriteLine ("Acceso satisfactorio a recurso protegido."); | |
} | |
} | |
} | |
private static void Bloquear(object bloqueo1, object bloqueo2) | |
{ | |
lock (bloqueo1) | |
{ | |
Thread.Sleep (1000); | |
lock (bloqueo2); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment