Синхронизировать поток ключевым словом lock - C#

Узнай цену своей работы

Формулировка задачи:

Есть задание, чтобы программа напоминала что-то вроде турникета, где пассажиры бы становились в очередь, бросали монетку(жетон) проходили через турникет, за каждым пассажиром турникет закрывается. В качестве подсказки нам сказали, что нужно синхронизировать поток с помощью ключевого слова lock. Но тот код что я написал и так выводит все в нужном порядке. Мог бы кто подсказать на моем примере, что я делаю не так...?
 class Program
    {
        static void Main(string[] args)
        {
            Metro metro = new Metro();
            for (int i = 0; i < 5; i++)
            {
                Thread myThread = new Thread(metro.BecomeInQueue);
                myThread.Name = "Пассажир " + i.ToString();
                myThread.Start();
            }
 
            Console.ReadLine();
        }
    }
    /*static*/ class Metro
    {
        public /*static*/ void BecomeInQueue()
        {
            string[] go = new string[4] { "Стал в очередь", "Бросил монетку", "Прошел через турникет", "Турникет закрылся" };
            for (int i = 0; i < go.Length; i++)
            Console.WriteLine($"{Thread.CurrentThread.Name}: {go[i]}");
        }
}

Решение задачи: «Синхронизировать поток ключевым словом lock»

textual
Листинг программы
        static object _lock = new object();
        public static void BecomeInQueue()
        {
            var go = new string[4] { "Стал в очередь", "Бросил монетку", "Прошел через турникет", "Турникет закрылся" };
            var random = new Random(Environment.TickCount + System.Threading.Thread.CurrentThread.ManagedThreadId);
            System.Threading.Thread.Sleep(random.Next(500));
            Console.WriteLine($@"{DateTime.Now.TimeOfDay} : {System.Threading.Thread.CurrentThread.Name}: {go[0]}");
            System.Threading.Thread.Sleep(random.Next(100));
            lock (_lock)
            {
                for (var i = 1; i < go.Length; i++)
                {
                    Console.WriteLine($@"{DateTime.Now.TimeOfDay} :{System.Threading.Thread.CurrentThread.Name}: {go[i]}");
                }
            }          
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы