none
Создание объекта блокировки? RRS feed

  • Вопрос

  • всем привет, имеется такой пример:

    class Program
        {
            static object locker = new object();
    
            static void WriteSecond()
            {
                for (int i = 0; i < 20; i++)
                {
                    lock (locker)
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine(new string(' ', 10) + "Secondary");
                        Console.ForegroundColor = ConsoleColor.Gray;
                        Thread.Sleep(100);
                    }
                }
            }
    
            static void Main()
            {
                Console.SetWindowSize(80, 45);
    
                ThreadStart writeSecond = new ThreadStart(WriteSecond);
                Thread thread = new Thread(writeSecond);
                thread.Start();
              
                for (int i = 0; i < 20; i++)
                {
                    lock (locker)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("Primary");
                        Console.ForegroundColor = ConsoleColor.Gray;
                        Thread.Sleep(100);
                    }
                }
    
                // Delay.
                Console.ReadKey();
            }
        }

    как видно, создается две критические секции lock, и они используют один объект блокировки в двух разных методах - одна критическая секция в методе WriteSecond, а вторая в методе Mian() , но обе эти секции все равно находятся в пределах одного класса - класса Program.
    Возможно точно такое же "разделение" объекта блокировки между двумя критическими секциями, если эти секции будут находится разных классах?
    Если такое возможно, то попрошу привести пример кода с разъяснением к нему, а если нет - то почему?

    25 августа 2016 г. 9:18

Ответы

Все ответы

  • Возможно точно такое же "разделение" объекта блокировки между двумя критическими секциями, если эти секции будут находится разных классах?

    Смущает слово "разделение". Что вы под ним имеет ввиду? По сути никакого разделения нет. Один объект блокировки работает везде. То есть пока поток заблокирован одной процедурой, другая не сработает.

    Если вам такое поведение нужно на уровне разных классов, то достаточно вынести объект блокировки в класс приложения (в разных типах проектов, это реализуется чуть чуть по разному). В общем идея в том, что бы доступ к объекту блокировки был на уровне всего приложения, а не на уровне отдельного экземпляра класса.


    VB.Net - WPF, UWP

    25 августа 2016 г. 11:36
    Отвечающий
  • Самый простой пример, может быть такой:

    class Program
    {
       public static object locker = new object();

    Теперь из любого класса вашей программы вы сможете обратиться к нему вот так:

    lock (Program.locker)

    25 августа 2016 г. 13:52
    Отвечающий