Advertisement
Layvu

M1. Многопоточное программирование

Apr 17th, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.62 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace ParallelWork;
  5.  
  6. class Program
  7. {
  8.     static readonly object locker = new();
  9.     static int sharedData;
  10.     static int readerCount;
  11.     static bool writerActive;
  12.  
  13.     static void Main()
  14.     {
  15.         for (var i = 0; i < 3; i++)
  16.         {
  17.             var readerThread = new Thread(Reader);
  18.             readerThread.Start();
  19.         }
  20.  
  21.         for (var i = 0; i < 2; i++)
  22.         {
  23.             var writerThread = new Thread(Writer);
  24.             writerThread.Start();
  25.         }
  26.     }
  27.  
  28.     private static void Reader()
  29.     {
  30.         while (true)
  31.         {
  32.             lock (locker)
  33.             {
  34.                 if (writerActive) Monitor.Wait(locker);
  35.  
  36.                 readerCount++;
  37.                 Thread.Sleep(2000);
  38.                 Console.WriteLine("ReaderThread {0} считал данные: {1}", Thread.CurrentThread.ManagedThreadId, sharedData);
  39.                 readerCount--;
  40.                
  41.                 Monitor.PulseAll(locker);
  42.             }
  43.         }
  44.     }
  45.  
  46.     private static void Writer()
  47.     {
  48.         while (true)
  49.         {
  50.             lock (locker)
  51.             {
  52.                 if (writerActive || readerCount > 0)
  53.                     Monitor.Wait(locker);
  54.  
  55.                 writerActive = true;
  56.                 sharedData++;
  57.                 Thread.Sleep(1000);
  58.                 Console.WriteLine("WriterThread {0} записал данные: {1}", Thread.CurrentThread.ManagedThreadId, sharedData);
  59.                 writerActive = false;
  60.                
  61.                 Monitor.PulseAll(locker);
  62.             }
  63.         }
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement