Синхронизация с помощью типа System.Threading.Monitor

Синхронизация с помощью типа System.Threading.Monitor

Оператор C# lock на самом деле является лишь ключевым словом, обозначающим использование типа класса System.Threading.Monitor. После обработки компилятором C# контекст блокировки превращается в следующее (вы можете убедиться в этом с помощью ildasm.exe).

public void PrintNumbers() {

 Monitor.Enter(this);

 try {

  // Вызов информации Thread.

  Console.WriteLine("-› {0} выполняет PrintNumbers()", Thread.CurrentThread.Name); // Вывод чисел.

  Console.Write("Ваши числа: ");

  for (int i = 0; i ‹ 10; i++) {

   Random r = new Random();

   Thread.Sleep(1000* r.Next(5));

   Console.Write(i + ", ");

  }

  Console.WriteLine();

 } finallу {

  Monitor.Exit(this);

 }

}

Во-первых, заметим, что конечным получателем маркера потока, который был указан в качестве аргумента ключевого слова lock, является метод Monitor.Enter(). Во-вторых, весь программный код в рамках контекста соответствующей блокировки помещен в блок try. Соответствующий блок finally гарантирует, что маркер потока будет освобожден (с помощью метода Monitor.Exit()), независимо от исключений, которые могут возникать в среде выполнения. Если изменить программу MultiThreadSharedData так, чтобы тип Monitor использовался непосредственно (как это будет сделано чуть позже), то ее вывод останется тем же.

При использовании ключевого слова lock, кажется, требуется меньший ввод программного кода, чем при явном использований типа System.Threading.Monitor, поэтому вы можете задать вопрос о преимуществах непосредственного использования типа Monitor. Краткий ответ: контроль. При использовании типа Monitor вы можете дать указание активному потоку подождать (с помощью метода Wait()), информировать ожидающие потоки о завершении текущего потока (с помощью методов Pulse() и PulseAll()) и т.д.

В большинстве случаев вам будет вполне достаточно возможностей, обеспечиваемых ключевым словам C# lock. Но если вы захотите рассмотреть другие члены класса Monitor, обратитесь к документации .NET Framework 2.0 SDK.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

2.1.2. Настройка модемного соединения с помощью конфигуратора system-config-network

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

2.1.2. Настройка модемного соединения с помощью конфигуратора system-config-network Все сетевые соединении в Fedora настраиваются с помощью конфигуратора system-сonfig-network. Но именно для модемного соединения его использовать неудобно - нельзя указать несколько телефонов дозвона, особую


[service monitor]

Из книги Документация NetAMS автора Автор неизвестен

[service monitor] Сервис monitor позволяет осуществлять запись данных из заголовков пакетов, относящихся к указанным юнита. При этом в базе данных сохраняется не только информация о локальном источнике–получателе пакета, размере и времени, но и об удаленной стороне. Таким образом,


monitor

Из книги Тонкости реестра Windows Vista. Трюки и эффекты автора Клименко Роман Александрович

monitor monitor to { storage N | file XXXX | netflow IP PORT}no monitor to …monitor unit { N | XXXX }no monitor unit { N | XXXX }show


Registry Monitor

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Registry Monitor Статус: Freeware.Размер: 271 Кбайт.Разработчик: http://technet.microsoft.com/ru-ru/sysinternals/bb896652(en-us).aspx.Программа не предназначена для внесения в реестр каких-либо изменений. Тем не менее целесообразность ее использования не вызывает сомнений, поскольку она предоставляет возможность


Базовые классы System.MulticastDelegate и System.Delegate

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Базовые классы System.MulticastDelegate и System.Delegate Таким образом, при создании типов c помощью) ключевого слова delegate в C# вы неявно объявляете тип класса, являющегося производным от System.MulticastDelegate. Этот класс обеспечивает своим потомкам доступ к списку с адресами тех методов, которые


Получение Туре с помощью System.Object.GetType()

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Получение Туре с помощью System.Object.GetType() Экземпляр класса Туре можно получить множеством способов. Нельзя только непосредственно создать объект Туре, используя для этого ключевое слово new, поскольку класс Туре является абстрактным. Чтобы привести пример одной из


Получение Туре с помощью System.Type.GetType()

Из книги автора

Получение Туре с помощью System.Type.GetType() Более гибкий подход обеспечивается использованием статического члена GetType() класса System.Type с указанием абсолютного имени соответствующего типа в виде строки. При использовании такого подхода для извлечения метаданных уже не


Пространство имен System.Threading

Из книги автора

Пространство имен System.Threading В рамках платформы .NET пространство имен System.Threading предлагает ряд типов, позволяющих строить многопоточные приложения. Вдобавок к типам, с помощью которых можно взаимодействовать с отдельными потоками CLR, в этом пространстве имен определены


Класс System.Threading.Thread

Из книги автора

Класс System.Threading.Thread Основным в пространстве имен System.Threading является класс Thread. Этот класс представляет собой объектный контейнер отдельной ветви выполнения в конкретном домене приложения. Он определяет ряд методов (как статических, так и общедоступных), которые позволяют


Синхронизация с помощью ключевого слова lock в C#

Из книги автора

Синхронизация с помощью ключевого слова lock в C# Первой из возможностей, которую вы можете применить в C# для синхронизации доступа к совместно используемым ресурсам, является использование ключевого слова lock. Это ключевое слово позволяет определить контекст операторов,


Синхронизация с помощью типа System.Threading.Interlocked

Из книги автора

Синхронизация с помощью типа System.Threading.Interlocked В это всегда верится с трудом, пока вы не проверите соответствующий программный код CIL, но и операции присваивания, и базовые арифметические операции не являются атомарными. Поэтому в пространстве имен System.Threading предлагается


Синхронизация с помощью атрибута [Synchronization]

Из книги автора

Синхронизация с помощью атрибута [Synchronization] Последним из рассмотренных здесь примитивов синхронизации будет атрибут [Synchronization], который определяется в пространстве имен System.Runtime.Remoting.Contexts. Этот атрибут уровня класса для безопасности потока эффективно блокирует весь


ГЛАВА 19. Создание окон с помощью System.Windows.Forms

Из книги автора

ГЛАВА 19. Создание окон с помощью System.Windows.Forms Если вы прочитали предыдущие 18 глав, вы должны иметь солидную базу дли использования языка программирования C# и архитектуры .NET. Вы, конечно же, можете применить полученные знания для построения консольных приложений следующего


Основные члены типа System.Web.Ul.WebControls.WebControl

Из книги автора

Основные члены типа System.Web.Ul.WebControls.WebControl Можно сказать, что тип Control предлагает возможности поведения, не относящиеся к графическому интерфейсу. С другой стороны, базовый класс WebControl обеспечивает полиморфный графический интерфейс для всех Web-элементов поведения, как


13.2.1. Синхронизация с помощью критических секций

Из книги автора

13.2.1. Синхронизация с помощью критических секций Простейший способ синхронизации дают критические секции. Когда поток входит в критическую секцию программы, гарантируется, что никакой другой поток не войдет в нее, пока первый не выйдет.Если акцессору Thread.critical присвоить


10.5.1. Запуск и ожидание с помощью system()

Из книги автора

10.5.1. Запуск и ожидание с помощью system() Программам часто требуется запускать другие программы и ожидать их завершения, прежде чем продолжать свою работу. Функция system() позволяет это делать достаточно просто.int system (const char* cmd);system() порождает дочерний процесс, который