Синхронизация с помощью ключевого слова 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.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Num Lock, Caps Lock, Scroll Lock
Num Lock, Caps Lock, Scroll Lock Некоторые сетуют, что при входе пользователя в систему переключатель клавиатуры Num Lock всегда выключен. Можно ли сделать, чтобы он всегда был включен? Да, можно. Для этого найдите ветвь HKCUСontrol PanelKeyboardи установите строковое значение °InitialKeyboardIndicators° равным
LOCK SIGNAL
LOCK SIGNAL Параметры в ibconfig V4_LOCK_SIGNAL 16ANY_LOCK_SIGNAL 16
LOCK ACQUIRE SPINS
LOCK ACQUIRE SPINS Параметры в ibconfig LOCK_ACQUIRE_SPINS 0
Правило 42: Усвойте оба значения ключевого слова typename
Правило 42: Усвойте оба значения ключевого слова typename Вопрос: какая разница между «class» и «typename» в следующем объявлении шаблона:template <class T> class Widget; // использует “class”template <typename T> class Widget; // использует “typename”Ответ: никакой. Когда в шаблоне объявляется параметр типа, class
13.2.1. Синхронизация с помощью критических секций
13.2.1. Синхронизация с помощью критических секций Простейший способ синхронизации дают критические секции. Когда поток входит в критическую секцию программы, гарантируется, что никакой другой поток не войдет в нее, пока первый не выйдет.Если акцессору Thread.critical присвоить
Синхронизация с помощью типа System.Threading.Monitor
Синхронизация с помощью типа System.Threading.Monitor Оператор C# lock на самом деле является лишь ключевым словом, обозначающим использование типа класса System.Threading.Monitor. После обработки компилятором C# контекст блокировки превращается в следующее (вы можете убедиться в этом с помощью
Синхронизация с помощью типа System.Threading.Interlocked
Синхронизация с помощью типа System.Threading.Interlocked В это всегда верится с трудом, пока вы не проверите соответствующий программный код CIL, но и операции присваивания, и базовые арифметические операции не являются атомарными. Поэтому в пространстве имен System.Threading предлагается
Синхронизация с помощью атрибута [Synchronization]
Синхронизация с помощью атрибута [Synchronization] Последним из рассмотренных здесь примитивов синхронизации будет атрибут [Synchronization], который определяется в пространстве имен System.Runtime.Remoting.Contexts. Этот атрибут уровня класса для безопасности потока эффективно блокирует весь
Утилита Lock Print
Утилита Lock Print Программой, которая выбирает статистику таблицы блокировки, является исполняемый модуль fb_lock_print, который можно найти в каталоге /bin каталога инсталляции Firebird. (Для версии 1.0.x ищите iblockpr.exe в Windows или gds_lock_pr в POSIX.) Доступны два синтаксиса: один для статичного
Режим Num Lock
Режим Num Lock При входе пользователя в систему режим Num Lock по умолчанию выключен. Однако с помощью реестра можно сделать так, что по умолчанию этот режим будет включен. Для этого необходимо в разделе реестра HKEY_USERS.DEFAULTControl PanelKeyboard присвоить строковому параметру InitialKeyboardIndicators
Оператор lock
Оператор lock Оператор lock имеет вид: lock объект do оператор Объект обязательно принадлежит к ссылочному типу.Оператор lock гарантирует, что оператор будет выполняться только одним потоком. Объект здесь хранит блокировку, а оператор, представляющий собой тело оператора lock,
С божьей помощью вопрос о свободе слова и самовыражения в Интернете окончательно снят Сергей Голубицкий
С божьей помощью вопрос о свободе слова и самовыражения в Интернете окончательно снят Сергей Голубицкий Опубликовано 18 июля 2013 12 июня 2013 года была поставлена окончательная точка в продолжительной конфронтации французских властей и Twitter:
Kensington Lock
Kensington Lock Еще 5 лет назад наличие ноутбука свидетельствовало о высоком статусе его владельца. Сегодня ситуация несколько изменилась, но все равно мобильный ПК – довольно дорогое приобретение. Значительно уменьшились размеры и вес ноутбуков, что облегчило не только их
Слова, слова, слова… Автор: Евгений Козловский.
Слова, слова, слова… Автор: Евгений Козловский. © 2004, Издательский дом | http://www.computerra.ru/Журнал «Домашний компьютер» | http://dk.compulenta.ru/Этот материал Вы всегда сможете найти по его постоянному адресу: /2006/120/276445/Интересно, сколько двенадцатизначных чисел вы способны оперативно