Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Создание эффективных приложений для Windows Джеффри Рихтер 2004 (Книга).pdf
Скачиваний:
375
Добавлен:
15.06.2014
Размер:
8.44 Mб
Скачать

Заметьте, что объект-семафор отслеживает, сколько элементов находится в оче реди. Вы, наверное, сразу же поняли, что это значение увеличивается, когда метод Append вызывает ReleaseSemaphore после добавления нового элемента к очереди. Но как оно уменьшается после удаления элемента из очереди, уже не столь очевидно. Эта операция выполняется вызовом WaitForMultipleObjects из метода Remove. Тут надо вспомнить, что побочный эффект успешного ожидания семафора заключается в уменьшении его счетчика на 1. Очень удобно для нас.

Теперь, когда Вы понимаете, как работает класс CQueue, Вы легко разберетесь в остальном коде этой программы.

Сводная таблица объектов, используемых для синхронизации потоков

В следующей таблице суммируются сведения о различных объектах ядра примени тельно к синхрониаации потоков.

Объект

Находится в занятом состоянии, когда

Переходит в свободное состояние, когда

Побочный эффект

 

 

 

успешного ожидания

 

 

 

 

Процесс

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

процесс завершается (ExitProcess,

Нет

Поток

активен

TerminateProcess)

Нет

 

 

поток завершается (ExitThread,

 

 

 

TerminateThread)

 

 

 

 

 

Объект

Находится в занятом состоянии,

Переходит в свободное состояние, когда:

Побочный эффект

 

когда:

 

успешного ожидания

 

 

 

 

Задание

время, выделенное заданию, еще не

время, выделенное заданию, истекло

Нет

 

истекло

 

 

 

 

 

 

Файл

выдан запрос на ввод-вывод

завершено выполнение запроса на ввод-

Нет

 

 

вывод

 

 

 

 

 

Консольный

ввода нет

ввод есть

Нет

ВВОД

 

 

 

Уведомление об

в файловой системе нет изменений

файловая система обнаруживает

Сбрасывается в исходное

изменении файла

 

изменения

состояние

Событие с

вызывается ResetEvent, PulseEvent или

вызывается SetEvent или PulseEvent

Сбрасывается в исходное

автосбросом

ожидание успешно завершилось

 

состояние

Событие со

вызывается ResetEvent или PulseEvent

вызывается SetEvent или PulseEvent

Нет

сбросом вручную

 

 

 

 

 

 

 

Ожидаемый

вызывается CancelWaitableТiтеr или

наступает время срабатывания

Сбрасывается в исходное

таймер с

ожидание успешно завершилось

(SetWaitableTimer)

состояние

автосбросом

 

 

 

Ожидаемый

вызывается CancelWaitableTimer

наступает время срабатывания

Нет

таймер со сбросом

 

(SetWaitableTimef)

 

вручную

 

 

 

 

 

 

 

Семафор

ожидание успешно завершилось

счетчик > 0 (ReleaseSemaphore)

Счетчик уменьшается на

 

 

 

1

Мьютекс

ожидание успешно завершилось

поток освобождает мьютекс

Передается пото ку во

 

 

(ReleaseMutex)

владение

 

 

 

 

Критическая

ожидание успешно завершилось (

поток освобождает критическую секцию

Передается потоку во

секция (поль

(Try)EnterCriticalSection)

(LeaveCriticalSection)

владение

зовательского

 

 

 

режима)