static void Main(string[] args) { // creamos e iniciamos un hilo del método DemasiadosBloqueos el cual recibe // como parámetro los objetos bloqueo1 y 2 object bloqueo1 = new object(); object bloqueo2 = new object(); new Thread(() => DemasiadosBloqueos(bloqueo1, bloqueo2)).Start(); // bloqueamos esta sección de codigo usando como // objeto sincronizador el objeto bloqueo2 // con la ayuda de monitor esperamos un tiempo para ver si podemos acceder al // objeto bloqueado lock (bloqueo2) { Thread.Sleep(1000); Console.WriteLine("Monitor.TryEnter permite no quedarse atascado, retornado falso depuesta de que el timeout ha expirado"); if (Monitor.TryEnter(bloqueo1, TimeSpan.FromSeconds(5))) { Console.WriteLine("Desbloqueo del recurso exitoso"); } else { Console.WriteLine("Temporizador no se cumple!"); } } Console.WriteLine("----"); new Thread(() => DemasiadosBloqueos(bloqueo1, bloqueo2)).Start(); // En este caso se causa una muerte del programa debido a que cada hilo // intenta acceder a un recurso bloqueado por el otro lock (bloqueo2) { Console.WriteLine("Aquí viene una muerte por bloqueo DEADLOCK"); Thread.Sleep(1000); lock (bloqueo1) { Console.WriteLine("Desbloqueo del recurso exitoso"); } } var c = new Contador(); var t1 = new Thread(() => Prueba(c)); var t2 = new Thread(() => Prueba(c)); }
static void Main(string[] args) { //Instancia e inicializacion de los 3 hilos para contador Console.WriteLine("Contador Incorrecto"); var c = new Contador(); var t1 = new Thread(() => Prueba(c)); var t2 = new Thread(() => Prueba(c)); var t3 = new Thread(() => Prueba(c)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); //Muestro los resultados obtenidos por el contador //lo que mostrara un resultado incorrecto al no estar bloqueado Console.WriteLine("Cuenta Total: {0}", c.Contar); Console.WriteLine("------"); Console.WriteLine("Contador correcto"); //Instancia e inicializacion de los 3 hilos para contadorConBloque var c1 = new ContadorConBloqueo(); var t4 = new Thread(() => Prueba(c1)); var t5 = new Thread(() => Prueba(c1)); var t6 = new Thread(() => Prueba(c1)); t4.Start(); t5.Start(); t6.Start(); t4.Join(); t5.Join(); t6.Join(); //Muestra los resultados esperados para este ejercicio el resiltado //correcto seria 0 Console.WriteLine("Cuenta Total: {0}", c1.Contar); Console.WriteLine("------"); Console.ReadLine(); }
static void Main(string[] args) { // Creamos una nueva instacia del objeto Contador // Iniciamos los 3 hilos // con join se ejecutan los tres hilos antes de que continue el hilo principal Console.WriteLine("Contador Incorrecto"); var c = new Contador(); var t1 = new Thread(() => Prueba(c)); var t2 = new Thread(() => Prueba(c)); var t3 = new Thread(() => Prueba(c)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Cuenta Total: {0}", c.Contar); Console.WriteLine("------"); // Creamos y ejecutamos los hilos de forma similiar al codigo anterior // pero en este caso la claseSinBloqueo implementa los métodos de increment // y decrement de Interlock para poder acceder al recurso. Console.WriteLine("Contador correcto"); var c1 = new ContadorSinBloqueo(); t1 = new Thread(() => Prueba(c1)); t2 = new Thread(() => Prueba(c1)); t3 = new Thread(() => Prueba(c1)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Cuenta Total: {0}", c1.Contar); Console.WriteLine("------"); }
static void Main(string[] args) { object bloqueo1 = new object(); object bloqueo2 = new object(); new Thread(() => DemasiadosBloqueos(bloqueo1, bloqueo2)).Start(); lock (bloqueo2) { Thread.Sleep(1000); Console.WriteLine("Monitor.TryEnter permite no quedarse atascado,retornado falso depuesta de que el timeout ha expirado"); //Verificamos que no exita ningun bloqueo if (Monitor.TryEnter(bloqueo1, TimeSpan.FromSeconds(5))) { Console.WriteLine("Desbloqueo del recurso exitoso"); } else { Console.WriteLine("Temporizador no se cumple!"); } } Console.WriteLine("----"); //Generamos los dos bloqueos para ver como trabaja el modo monitor new Thread(() => DemasiadosBloqueos(bloqueo1, bloqueo2)).Start(); lock (bloqueo2) { Console.WriteLine("Aquí viene una muerte por bloqueo DEADLOCK"); Thread.Sleep(1000); lock (bloqueo1) { Console.WriteLine("Desbloqueo del recurso exitoso"); } } var c = new Contador(); var t1 = new Thread(() => Prueba(c)); var t2 = new Thread(() => Prueba(c)); }
static void Main(string[] args) { // Creamos una nueva instacia del objeto Contador var c = new Contador(); // Creamos tres hilos con el método Prueba // y le pasamos como parámetro el objeto c como referencia var t1 = new Thread(() => Prueba(c)); var t2 = new Thread(() => Prueba(c)); var t3 = new Thread(() => Prueba(c)); // Iniciamos los 3 hilos // con join se ejecutan los tres hilos antes de que continue el hilo principal t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Cuenta Total: {0}", c.Contar); Console.WriteLine("------"); Console.WriteLine("Contador correcto"); // Creamos y ejecutamos los hilos de forma similiar al codigo anterior // pero en este caso le pasamos como parámetro el objeto con el bloqueo var c1 = new ContadorConBloqueo(); t1 = new Thread(() => Prueba(c1)); t2 = new Thread(() => Prueba(c1)); t3 = new Thread(() => Prueba(c1)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Cuenta Total: {0}", c1.Contar); Console.WriteLine("------"); }
static void Main(string[] args) { //Instancia e inicializacion de los 3 hilos para contar sin bloqueo Console.WriteLine("Contador Incorrecto"); var c = new Contador(); var t1 = new Thread(() => Prueba(c)); var t2 = new Thread(() => Prueba(c)); var t3 = new Thread(() => Prueba(c)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Cuenta Total: {0}", c.Contar); Console.WriteLine("------"); Console.WriteLine("Contador correcto"); //Instancia e inicializacion de los 3 hilos para contador con bloqueo var c1 = new ContadorConBloqueo(); t1 = new Thread(() => Prueba(c1)); t2 = new Thread(() => Prueba(c1)); t3 = new Thread(() => Prueba(c1)); t1.Start(); t2.Start(); t3.Start(); t1.Join(); t2.Join(); t3.Join(); Console.WriteLine("Cuenta Total: {0}", c1.Contar); Console.WriteLine("------"); Console.ReadLine(); }