Advertisement
kikosiak

Untitled

Dec 9th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.85 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7.  
  8. namespace ProducentKonsument
  9. {
  10.     class Program
  11.     {
  12.         static int licznik = 0;
  13.         static readonly int liczbaWatkow = 10;
  14.         static readonly int liczbaIteracji = 10;
  15.         static readonly object locking = new object();
  16.  
  17.         static EventWaitHandle pisanie = new ManualResetEvent(true);
  18.         static EventWaitHandle czytanie = new ManualResetEvent(false);
  19.  
  20.         static void Main(string[] args)
  21.         {
  22.             List<Thread> watkiKonsument = new List<Thread>();
  23.             //Random rand = new Random(); //random wspólny
  24.             for (int i = 0; i < liczbaWatkow; i++)
  25.             {
  26.                 var konsument = new Thread(() =>
  27.                 {
  28.                     //Random rand = new Random(); //random lokalny seed oparty na czasie
  29.                     Random rand = new Random(Thread.CurrentThread.ManagedThreadId); //random lokalny seed oparty na Id wątku
  30.  
  31.                     for (int j = 0; j < liczbaIteracji; j++)
  32.                     {
  33.  
  34.                         var czasUspienia = rand.Next(1000);
  35.                             Console.Write("{0} ", czasUspienia);
  36.                             Console.WriteLine("[{0}] ", licznik);
  37.                         lock (locking)
  38.                         {
  39.                             czytanie.WaitOne();
  40.                             czytanie.Reset();
  41.                         }
  42.                         pisanie.Set();
  43.                         Thread.Sleep(czasUspienia);                    
  44.                     }
  45.                 });
  46.                 watkiKonsument.Add(konsument);
  47.                 konsument.Start();
  48.             }
  49.  
  50.             Thread watekProducent = new Thread(() =>
  51.             {
  52.                 Random randPiszacy = new Random(Thread.CurrentThread.ManagedThreadId);
  53.                 try
  54.                 {
  55.                     while (true)
  56.                     {
  57.                         pisanie.WaitOne();
  58.                         pisanie.Reset();                      
  59.                         Interlocked.Increment(ref licznik);
  60.                         czytanie.Set();
  61.                         Thread.Sleep(randPiszacy.Next(100));
  62.                     }
  63.                 }
  64.                 catch (ThreadInterruptedException)
  65.                 {
  66.                     Console.WriteLine("\nWątek piszący został zakończony");
  67.                 }
  68.             });
  69.  
  70.             watekProducent.Start();
  71.  
  72.             foreach (var watek in watkiKonsument)
  73.             {
  74.                 watek.Join();
  75.             }
  76.  
  77.             watekProducent.Interrupt();
  78.             watekProducent.Join();
  79.  
  80.             Console.WriteLine("To już jest koniec, naciśnij ENTER...");
  81.             Console.ReadLine();
  82.         }
  83.     }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement