Читаем C# 4.0 полное руководство - 2011 полностью

Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки return;

}

Console.Write("тик ");

Monitor.Pulse(lockOn); // разрешить выполнение метода Tock

Monitor.Wait(lockOn);    // ожидать завершения метода Tock

}

}

Прежде всего обратите внимание на код метода Tick в блоке lock. Напомним, что методы Wait и Pulse могут использоваться только в синхронизированных блоках кода. В начале метода Tick проверяется значение текущего параметра, которое служит явным признаком остановки часов. Если это логическое значение false, то часы остановлены. В этом случае вызывается метод Pulse , разрешающий выполнение любого потока, ожидающего своей очереди. Мы еще вернемся к этому моменту в дальнейшем. Если же часы идут при выполнении метода Tick , то на экран выводится слово "тик" с пробелом, затем вызывается метод Pulse , а после него — метод

Wait . При вызове метода Pulse разрешается выполнение потока для того же самого объекта, а при вызове метода Wait выполнение метода Tick приостанавливается до тех пор, пока метод Pulse не будет вызван из другого потока. Таким образом, когда вызывается метод Tick , отображается одно слово "тик" с пробелом, разрешается выполнение другого потока, а затем выполнение данного метода приостанавливается.

Метод То с к является точной копией метода Tick , за исключением того, что он выводит на экран слово "так". Таким образом, при входе в метод То с к на экран выводится слово "так", вызывается метод Pulse , а затем выполнение метода Тоск приостанавливается. Методы Tick иТоск можно рассматривать как поочередно сменяющие друг друга, т.е. они взаимно синхронизированы.

Когда часы остановлены, метод Pulse вызывается для того, чтобы обеспечить успешный вызов метода Wait . Напомним, что метод Wait вызывается в обоих методах, Tick и Тоск , после вывода соответствующего слова на экран. Но дело в том, что когда часы остановлены, один из этих методов все еще находится в состоянии ожидания. Поэтому завершающий вызов метода Pulse требуется, чтобы выполнить ожидающий метод до конца. В качестве эксперимента попробуйте удалить этот вызов метода Pulse и понаблюдайте за тем, что при этом произойдет. Вы сразу же обнаружите, что программа "зависает", и для выхода из нее придется нажать комбинацию клавиш . Дело в том, что когда метод Wait вызывается в последнем вызове метода Тоск , соответствующий ему метод Pulse не вызывается, а значит, выполнение метода Тоск оказывается незавершенным, и он ожидает своей очереди до бесконечности.

Прежде чем переходить к чтению следующего раздела, убедитесь сами, если, конечно, сомневаетесь, в том, что следует обязательно вызывать методы Wait () и Pulse , чтобы имитируемые часы шли правильно. Для этого подставьте приведенный ниже вариант класса TickTock в рассматриваемую здесь программу. В этом варианте все вызовы методов Wait и Pulse исключены.

// Нерабочий вариант класса TickTock. class TickTock {

object lockOn = new object ;

public void Tick(bool running) { lock(lockOn) {

if (!running) { // остановить часы return;

}

Console.Write("тик ") ;

}

}

public void Tock (bool running) { lock(lockOn) {

if(!running) { // остановить часы return;

}

После этой подстановки результат выполнения данной программы будет выглядеть следующим образом.

тик тик тик тик тик так

так

так

так

так

Часы остановлены

Очевидно, что методыTick () иTock () больше не синхронизированы!

Взаимоблокировка и состояние гонки

Перейти на страницу:

Похожие книги

Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT