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

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

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

// Использование текущего объекта в качестве маркера потока.

lock(this) {

 // Весь программный код в этом контексте оказывается

 // устойчивым в отношении потоков.

}

При внимательном изучении метода PrintNumbers() становится ясно, что совместно используемым ресурсом, за доступ к которому соперничают потоки, является окно консоли. Поместите в рамки соответствующего контекста блокировки все операторы взаимодействии с типом Console так, как показано ниже.

public void PrintNumbers() {

 lock (this) {

  // Вывод информации 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();

 }

}

Тем самым вы создадите метод, который позволит текущему потоку завершить выполнение своей задачи. Как только поток вступит в контекст блокировки, соответствующий маркер блокировки (в данном случае эта ссылка на текущий объект) станет недоступным другим потокам, пока блокировка не будет снята в результате выхода потока из контекста блокировки. Например, если маркер блокировки получает поток А, то другие потоки не смогут войти в контекст до тех пор, пока поток А не освободит маркер блокировки.

Замечание. Если пытаться блокировать программный код в статическом методе, вы, очевидно, не можете использовать ключевое слово this. Но в этом случае можно передать объект System.Type соответствующего класса с помощью оператора C# typeof.

Если снова выполнить это приложение, вы увидите, что теперь каждый поток получает возможность закончить свою работу (рис. 14.10).

Рис. 14.10. Конкуренция в действии, третья попытка

Исходный код. Проект MultiThreadedPrinting размещен в подкаталоге, соответствующем главе 14.

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

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

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

Слова, слова, слова… Автор: Евгений Козловский.

Из книги Домашний компьютер № 6 (120) 2006 автора Журнал «Домашний компьютер»

Слова, слова, слова… Автор: Евгений Козловский. © 2004, Издательский дом | http://www.computerra.ru/Журнал «Домашний компьютер» | http://dk.compulenta.ru/Этот материал Вы всегда сможете найти по его постоянному адресу:  /2006/120/276445/Интересно, сколько двенадцатизначных чисел вы способны оперативно


Kensington Lock

Из книги Работа на ноутбуке автора Садовский Алексей

Kensington Lock Еще 5 лет назад наличие ноутбука свидетельствовало о высоком статусе его владельца. Сегодня ситуация несколько изменилась, но все равно мобильный ПК – довольно дорогое приобретение. Значительно уменьшились размеры и вес ноутбуков, что облегчило не только их


Num Lock, Caps Lock, Scroll Lock

Из книги Реестр Windows автора Климов Александр

Num Lock, Caps Lock, Scroll Lock Некоторые сетуют, что при входе пользователя в систему переключатель клавиатуры Num Lock всегда выключен. Можно ли сделать, чтобы он всегда был включен? Да, можно. Для этого найдите ветвь HKCUСontrol PanelKeyboardи установите строковое значение °InitialKeyboardIndicators° равным


Режим Num Lock

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

Режим Num Lock При входе пользователя в систему режим Num Lock по умолчанию выключен. Однако с помощью реестра можно сделать так, что по умолчанию этот режим будет включен. Для этого необходимо в разделе реестра HKEY_USERS.DEFAULTControl PanelKeyboard присвоить строковому параметру InitialKeyboardIndicators


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

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

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


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

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт

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


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

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

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


Правило 42: Усвойте оба значения ключевого слова typename

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Правило 42: Усвойте оба значения ключевого слова typename Вопрос: какая разница между «class» и «typename» в следующем объявлении шаблона:template <class T> class Widget; // использует “class”template <typename T> class Widget; // использует “typename”Ответ: никакой. Когда в шаблоне объявляется параметр типа, class


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

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

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


Утилита Lock Print

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Утилита Lock Print Программой, которая выбирает статистику таблицы блокировки, является исполняемый модуль fb_lock_print, который можно найти в каталоге /bin каталога инсталляции Firebird. (Для версии 1.0.x ищите iblockpr.exe в Windows или gds_lock_pr в POSIX.) Доступны два синтаксиса: один для статичного


С божьей помощью вопрос о свободе слова и самовыражения в Интернете окончательно снят Сергей Голубицкий

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

С божьей помощью вопрос о свободе слова и самовыражения в Интернете окончательно снят Сергей Голубицкий Опубликовано 18 июля 2013 12 июня 2013 года была поставлена окончательная точка в продолжительной конфронтации французских властей и Twitter:


LOCK SIGNAL

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

LOCK SIGNAL Параметры в ibconfig V4_LOCK_SIGNAL 16ANY_LOCK_SIGNAL 16


LOCK ACQUIRE SPINS

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

LOCK ACQUIRE SPINS Параметры в ibconfig LOCK_ACQUIRE_SPINS 0


Оператор lock

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

Оператор lock Оператор lock имеет вид: lock объект do оператор Объект обязательно принадлежит к ссылочному типу.Оператор lock гарантирует, что оператор будет выполняться только одним потоком. Объект здесь хранит блокировку, а оператор, представляющий собой тело оператора lock,