Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
У. Столлингс ГЛАВА 6 Межзадачное взаимодействие...doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

Переменные условий

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

cv_wait () Блокирование потока до тех пор, пока условие не будет выполнено

cv_signal() Активизация одного из потоков, заблокированных примитивом cv_wait()

cv_broadcast () Активизация всех потоков, заблокированных примитивом cv_wait()

Примитив cv_wait () освобождает связанный с ним мьютекс перед блокированием потока и вновь захватывает его перед завершением работы. Поскольку повторный захват мьютекса может быть заблокирован другим ожидающим потоком, следует повторно проверить выполнение условия, вызвавшего ожидание. Таким образом, типичный фрагмент кода, работающего с переменными условий, выглядит следующим образом:

mutex_enter(&m);

•

•

while(some_condition) {

cv_wait(&cv, &m);

}

•

•

mutex_exit(&m);

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

6.9. Механизмы параллельных вычислений в windows 2000

Windows 2000 (W2K) обеспечивает синхронизацию потоков как часть объектной архитектуры. Механизм, использованный W2K для реализации синхронизации, представляет собой семейство следующих объектов синхронизации.

  • Процесс.

  • Поток.

  • Файл.

  • Консольный ввод.

  • Уведомление об изменении файлов.

  • Мьютекс.

  • Семафор.

  • Событие.

  • Таймер ожидания.

Первые четыре объекта в этом списке могут использоваться для целей синхронизации, хотя это и не основное их предназначение. Остальные типы объектов разработаны специально для поддержки синхронизации.

Экземпляр каждого из перечисленных объектов может находиться в одном из двух состояний — сигнальном (signaled) и несигнальном (unsignaled); поток освобождается при входе объекта в сигнальное состояние. Механизм достаточно прост: поток выполняет запрос на ожидание к исполнительной системе W2K с использованием дескриптора объекта синхронизации. Когда объект входит в сигнальное состояние, исполнительная система W2K освобождает все потоки, находящиеся в состоянии ожидания этого объекта.

В табл. 6.2 приведен список событий, приводящих объекты в сигнальное состояние, и указано их влияние на ожидающие потоки.

Таблица 6.2. Объекты синхронизации Windows 2000

Тип объекта Определение Переход в Ожидающие

сигнальное потоки

состояние

Процесс Программа, включая Завершение послед- Освобождаются все

адресное пространство него потока потоки

и ресурсы, требуемые

для ее выполнения

Поток Выполнимая единица Завершение работы Освобождаются все

внутри процесса потока потоки

Файл Открытый файл или Завершение опера- Освобождаются все устройство ввода-вывода ции ввода-вывода потоки

Консольный ввод Буфер текстового окна Имеется введенная Освобождается

(например, используе- информация, дос- один поток

мый для операций вво- тупная процессу

да-вывода приложений

MS DOS)

Уведомление об Уведомление о любых Изменения в файло- Освобождается

изменении файлов изменениях файловой вой системе, соответ- один поток

системы ствующие заданному

объектом фильтру

Мьютекс Механизм обеспечения Поток освобождает Освобождается взаимоисключений в мьютекс один поток

средах Win32 и OS/2

Семафор Счетчик, регулирую- Счетчик семафора Освобождаются все

щий количество пото- обнуляется потоки

ков, которые могут

использовать ресурс

Событие Извещение о наступ- Поток осуществляет Освобождаются все лении некоторого со- событие потоки

бытия в системе

Таймер ожидания Счетчик, учитываю- Наступил указанный Освобождаются все

щий прошедшее вре- момент времени или потоки

мя истек указанный

интервал времени

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

Так же как и мьютексы, семафоры могут совместно использоваться потоками разных процессов. В W2K семафоры являются классическими семафорами-счетчиками.

Таймер ожидания — новый объект ядра, появившийся в Windows NT 4.0, который подает сигнал в определенный момент времени и/или через заданные промежутки времени.