Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Created August 21, 2014 14:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fhernd/b5cd9354e456f0cdf46b to your computer and use it in GitHub Desktop.
Save Fhernd/b5cd9354e456f0cdf46b to your computer and use it in GitHub Desktop.
Demostración de bloqueo por medio de uso incorrecto de lock.
using System;
using System.Threading;
namespace Recetas.Multithreading.Cap01.R0104
{
public sealed class BloqueoRegionCritica
{
// Instancias de bloqueo de región crítica:
private static Object bloqueo1 = new Object();
private static Object bloqueo2 = new Object();
public static void Main()
{
Console.Title = "--- Uso de Monitor y de Lock ---";
// Creación de un thread para prueba del método `MetodoConBloqueoExtentido`:
Thread t = new Thread (() => MetodoConBloqueoExtentido(bloqueo1, bloqueo2));
// Inicio de ejecución del thread:
t.Start ();
// Inicio de región crítica:
lock (bloqueo2)
{
Thread.Sleep (1000);
Console.WriteLine ("\nUso de Monitor.TryEnter para evitar bloqueo: ");
if (Monitor.TryEnter (bloqueo1, TimeSpan.FromSeconds (5)))
{
Console.WriteLine ("\tAcceso seguro a la región crítica.");
}
else
{
Console.WriteLine ("El tiempo de bloqueo permitido ha transcurrido.");
}
}
// Creación otro thread para demostrar el bloqueo definitivo:
Console.WriteLine ("\n\nDemostración de bloqueo definitivo");
Thread t2 = new Thread (() => MetodoConBloqueoExtentido(bloqueo1, bloqueo2));
// Inicio ejecución:
t2.Start ();
lock (bloqueo2)
{
Console.WriteLine ("Aquí ocurre un bloqueo permanente.");
Thread.Sleep (1000);
lock(bloqueo1)
{
Console.WriteLine ("\tAcceso seguro a esta región crítica.");
}
}
}
// Simula una tarea que contiene regiones críticas:
private static void MetodoConBloqueoExtentido(Object o1, Object o2)
{
// Bloqueo sobre el primer objeto -bloqueo1-:
lock (o1)
{
Thread.Sleep (1000);
// Bloqueo sobre el segundo objeto -bloqueo2-:
lock (o2);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment