using System;
using System.Threading;
using System.Collections.Generic;
using System.Text;

namespace ThreadEvents
{
   class Program
   {
      static ManualResetEvent mre = new ManualResetEvent(false);
      static string sharedResource = "Zasób współdzielony.";

      static void Main(string[] args)
      {
         Thread[] workers = new Thread[10];
         Console.WriteLine("Kolejkowanie wątków...");
         for (int i = 0; i < 10; i++)
         {
            Thread worker = new Thread(new ThreadStart(DoWork));
            workers[i] = worker;
            worker.Start();
         }
         // wszystkie pozostałe wątki otrzymują chwilę czasu na ustawienie się w kolejce za zdarzeniem resetującym
         Thread.Sleep(TimeSpan.FromSeconds(2));
         Console.WriteLine("Wątki powinny być już ustawione w kolejce, wysyłam im sygnał do pracy...");
         mre.Set();
         foreach (Thread worker in workers)
            worker.Join();
         Console.WriteLine("Praca zakończona, wynik pracy: {0}", sharedResource);
         Console.ReadLine();
      }

      static void DoWork()
      {
         mre.WaitOne();
         lock (sharedResource)
         {
            Console.WriteLine("Praca mogła zostać wykonana.");
            sharedResource += " zmodyfikowany. ";
         }
      }
   }
}
