Advertisement
Kunka

WSPOLBIEGI_JOUJOU

May 27th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.46 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Producer_Consumer_PW_Kohnke.Properties
  5. {
  6.     class Program
  7.     {
  8.         static object obiektSynchronizacjiMagazynu = new object();
  9.         static object obiektSynchronizacjiProducenta = new object();
  10.         static object obiektSynchronizacjiKonsumenta = new object();
  11.         // losowy czas, na ktory usypiany bedzie watek producenta/konsumenta
  12.         // przy czym okreslam maksymalny czas jaki random moze osiagnac
  13.         static Random r = new Random();
  14.  
  15.         static Thread watekProducenta = null;
  16.         static Thread watekKonsumenta = null;
  17.  
  18.         const int maksymalnyCzasProdukcji = 1000;
  19.         const int maksymalnyCzasKonsumpcji = 1000;
  20.         const int maksymalnyCzasUruchomieniaProdukcji = 5000;
  21.         const int maksymalnyCzasUruchomieniaKonsumpcji = 5000;
  22.  
  23.         // z gory zakladam pojemnosc magazynu
  24.         static int pojemnoscMagazynu = 40;
  25.         static int licznikElementowWMagazynie = 1;
  26.  
  27.         static void wyswietlStanMagazynu()
  28.         {
  29.             Console.WriteLine(("Liczba elementow w magazynie: " + licznikElementowWMagazynie));    
  30.         }
  31.  
  32.         static void Main(string[] args)
  33.         {
  34.             // wyrazenie lambda - metoda bez deklaracji. Parametry => kod do wykonania.
  35.             ThreadStart akcjapProducenta =
  36.                 () =>
  37.                 {
  38.                     Console.WriteLine("Wątek producenta jest uruchamiany");
  39.                     while (true)
  40.                     {
  41.                         lock (obiektSynchronizacjiMagazynu)
  42.                         {
  43.                             licznikElementowWMagazynie++;
  44.                             Console.WriteLine("Element zostal dodany przez producenta.");
  45.                         }
  46.  
  47.                         wyswietlStanMagazynu();
  48.                         if (licznikElementowWMagazynie >= pojemnoscMagazynu)
  49.                         {
  50.                             Console.WriteLine("Wątek producenta zostaje uspiony.");
  51.                             lock (obiektSynchronizacjiProducenta) ;
  52.                             Monitor.Wait(obiektSynchronizacjiProducenta);
  53.                             Console.WriteLine("Wątek producenta zostanie wznowiony.");
  54.  
  55.                             Thread.Sleep(r.Next(maksymalnyCzasUruchomieniaProdukcji));
  56.                             Console.WriteLine("Watek producenta został wznowiony");
  57.                         }
  58.  
  59.                         lock (obiektSynchronizacjiKonsumenta)
  60.                             Monitor.Pulse(obiektSynchronizacjiKonsumenta);
  61.                         Thread.Sleep(r.Next(maksymalnyCzasProdukcji));
  62.                     }
  63.                 };
  64.            
  65.             ThreadStart akcjaKonsumenta =
  66.                 () =>
  67.                 {
  68.                     Console.WriteLine("Wątek konsumenta jest uruchamiany");
  69.                     while (true)
  70.                     {
  71.                         lock (obiektSynchronizacjiMagazynu)
  72.                         {
  73.                             licznikElementowWMagazynie--;
  74.                             Console.WriteLine("Konsument pobral element z magazynu");
  75.                         }
  76.  
  77.                         wyswietlStanMagazynu();
  78.                         if (licznikElementowWMagazynie <= 0)
  79.                         {
  80.                             Console.WriteLine("Watek konsumenta zostanie uspiony");
  81.                             lock (obiektSynchronizacjiKonsumenta)
  82.                                 Monitor.Wait(obiektSynchronizacjiKonsumenta);
  83.                             Console.WriteLine("Watek konsumenta zostanie wznowiony");
  84.  
  85.                             Thread.Sleep(r.Next(maksymalnyCzasKonsumpcji));
  86.                             Console.WriteLine("Watek konsumenta zostal wznowiony");
  87.                         }
  88.  
  89.                         lock (obiektSynchronizacjiProducenta)
  90.                             Monitor.Pulse(obiektSynchronizacjiProducenta);
  91.                         Thread.Sleep(r.Next(maksymalnyCzasKonsumpcji));
  92.                     }
  93.                 };
  94.  
  95.             watekProducenta = new Thread(akcjapProducenta);
  96.             watekProducenta.IsBackground = true;
  97.             watekProducenta.Start();
  98.            
  99.             watekKonsumenta = new Thread(akcjaKonsumenta);
  100.             watekKonsumenta.IsBackground = true;
  101.             watekKonsumenta.Start();
  102.  
  103.             Console.ReadLine();
  104.             Console.Write("Koniec. ");
  105.             wyswietlStanMagazynu();
  106.         }
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement