Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Threading;
- namespace Producer_Consumer_PW_Kohnke.Properties
- {
- class Program
- {
- static object obiektSynchronizacjiMagazynu = new object();
- static object obiektSynchronizacjiProducenta = new object();
- static object obiektSynchronizacjiKonsumenta = new object();
- // losowy czas, na ktory usypiany bedzie watek producenta/konsumenta
- // przy czym okreslam maksymalny czas jaki random moze osiagnac
- static Random r = new Random();
- static Thread watekProducenta = null;
- static Thread watekKonsumenta = null;
- const int maksymalnyCzasProdukcji = 1000;
- const int maksymalnyCzasKonsumpcji = 1000;
- const int maksymalnyCzasUruchomieniaProdukcji = 5000;
- const int maksymalnyCzasUruchomieniaKonsumpcji = 5000;
- // z gory zakladam pojemnosc magazynu
- static int pojemnoscMagazynu = 40;
- static int licznikElementowWMagazynie = 1;
- static void wyswietlStanMagazynu()
- {
- Console.WriteLine(("Liczba elementow w magazynie: " + licznikElementowWMagazynie));
- }
- static void Main(string[] args)
- {
- // wyrazenie lambda - metoda bez deklaracji. Parametry => kod do wykonania.
- ThreadStart akcjapProducenta =
- () =>
- {
- Console.WriteLine("Wątek producenta jest uruchamiany");
- while (true)
- {
- lock (obiektSynchronizacjiMagazynu)
- {
- licznikElementowWMagazynie++;
- Console.WriteLine("Element zostal dodany przez producenta.");
- }
- wyswietlStanMagazynu();
- if (licznikElementowWMagazynie >= pojemnoscMagazynu)
- {
- Console.WriteLine("Wątek producenta zostaje uspiony.");
- lock (obiektSynchronizacjiProducenta) ;
- Monitor.Wait(obiektSynchronizacjiProducenta);
- Console.WriteLine("Wątek producenta zostanie wznowiony.");
- Thread.Sleep(r.Next(maksymalnyCzasUruchomieniaProdukcji));
- Console.WriteLine("Watek producenta został wznowiony");
- }
- lock (obiektSynchronizacjiKonsumenta)
- Monitor.Pulse(obiektSynchronizacjiKonsumenta);
- Thread.Sleep(r.Next(maksymalnyCzasProdukcji));
- }
- };
- ThreadStart akcjaKonsumenta =
- () =>
- {
- Console.WriteLine("Wątek konsumenta jest uruchamiany");
- while (true)
- {
- lock (obiektSynchronizacjiMagazynu)
- {
- licznikElementowWMagazynie--;
- Console.WriteLine("Konsument pobral element z magazynu");
- }
- wyswietlStanMagazynu();
- if (licznikElementowWMagazynie <= 0)
- {
- Console.WriteLine("Watek konsumenta zostanie uspiony");
- lock (obiektSynchronizacjiKonsumenta)
- Monitor.Wait(obiektSynchronizacjiKonsumenta);
- Console.WriteLine("Watek konsumenta zostanie wznowiony");
- Thread.Sleep(r.Next(maksymalnyCzasKonsumpcji));
- Console.WriteLine("Watek konsumenta zostal wznowiony");
- }
- lock (obiektSynchronizacjiProducenta)
- Monitor.Pulse(obiektSynchronizacjiProducenta);
- Thread.Sleep(r.Next(maksymalnyCzasKonsumpcji));
- }
- };
- watekProducenta = new Thread(akcjapProducenta);
- watekProducenta.IsBackground = true;
- watekProducenta.Start();
- watekKonsumenta = new Thread(akcjaKonsumenta);
- watekKonsumenta.IsBackground = true;
- watekKonsumenta.Start();
- Console.ReadLine();
- Console.Write("Koniec. ");
- wyswietlStanMagazynu();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement