Manual reset event

Коли один з потоків робить певну частину коду, інші мають зачекати до сигналу

Коли не має певної ділянки коду, яку треба заблокувати між потоками

Коли пишемо в файл, забороняємо його читати в цей час

        static ManualResetEvent mre = new ManualResetEvent(false);

        static void Main(string[] args)

        {

            // new Thread(Write).Start();

            Task.Run(() => Write());

            for (int i = 0; i < 5; i++)

            {

                // new Thread(Read).Start();

                Task.Run(() => Read());

            }

            Console.ReadKey();

        }

        public static void Write() {

            Console.WriteLine("START WRITING> " + Thread.CurrentThread.ManagedThreadId);

            mre.Reset();   // заборонити доступ

            Thread.Sleep(5000);

            Console.WriteLine("END WRITING " + Thread.CurrentThread.ManagedThreadId);

            mre.Set();   // Сигнал, можна іншим потокам отримати доступ

        }

        public static void Read() {

            Console.WriteLine("START R> " + Thread.CurrentThread.ManagedThreadId);

            mre.WaitOne();

            Thread.Sleep(2000);

            Console.WriteLine("END R " + Thread.CurrentThread.ManagedThreadId);

        }

START WRITING> 11

START R> 12

START R> 13

START R> 14

START R> 15

START R> 16

END WRITING 11

END R 12

END R 15

END R 14

END R 16

END R 13