Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Threading;
- namespace Recetas.Multithreading.Cap04.R0109
- {
- public sealed class PruebaContador
- {
- public static void Main()
- {
- Console.Title = "No-Sincronizado vs Sincronizado";
- Console.WriteLine ();
- Console.WriteLine ("=== Contador con Errores ===");
- // Crea un ContadorBasico:
- ContadorBasico c = new ContadorBasico();
- // Crea 3 threads:
- Thread t1 = new Thread(() => ProbarContador(c));
- Thread t2 = new Thread(() => ProbarContador(c));
- Thread t3 = new Thread(() => ProbarContador(c));
- // Inicio de ejecución de los threads:
- t1.Start();
- t2.Start();
- t3.Start();
- // Espera a que finalicen:
- t1.Join();
- t2.Join();
- t3.Join();
- Console.WriteLine ("\nCuenta total (no sincronizado): {0}\n\n", c.Cuenta.ToString());
- Console.WriteLine ("=== Contador con Sincronización ===");
- // Crea una instancia de ContadorSincronizado:
- ContadorSincronizado cs = new ContadorSincronizado();
- t1 = new Thread(() => ProbarContador(cs));
- t2 = new Thread(() => ProbarContador(cs));
- t3 = new Thread(() => ProbarContador(cs));
- // Inicio de ejecución de los threads:
- t1.Start();
- t2.Start();
- t3.Start();
- // Espera a que finalicen:
- t1.Join();
- t2.Join();
- t3.Join();
- Console.WriteLine ("\nCuenta total (sincronizado): {0}\n\n", cs.Cuenta.ToString());
- }
- private static void ProbarContador(ContadorAbstracto c)
- {
- for (int i = 0; i < 10000; ++i)
- {
- c.Incrementar();
- c.Decrementar();
- }
- }
- }
- public abstract class ContadorAbstracto
- {
- public abstract void Incrementar();
- public abstract void Decrementar();
- }
- // Clase que representa un contador sin sincronización:
- public class ContadorBasico : ContadorAbstracto
- {
- public int Cuenta
- {
- get;
- private set;
- }
- public override void Incrementar()
- {
- ++Cuenta;
- }
- public override void Decrementar()
- {
- --Cuenta;
- }
- }
- // Clase que representa un contador con sincronización:
- public class ContadorSincronizado : ContadorAbstracto
- {
- private readonly Object bloqueo = new Object();
- public int Cuenta
- {
- get;
- private set;
- }
- public override void Incrementar()
- {
- lock (bloqueo)
- {
- ++Cuenta;
- }
- }
- public override void Decrementar()
- {
- lock (bloqueo)
- {
- --Cuenta;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement