Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os_rgr.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
186.37 Кб
Скачать

2.Синхронизация задач и процессов

Синхронизация задач заключается в том, что некоторые задачи должны приостанавливать свое выполнение до тех пор, пока не произойдут те или иные события, связанные с другими задачами. В программном интерфейсе ОС Windows предусмотрены различные средства синхронизации задач, как выполняющихся в рамках одного процесса, так и принадлежащих разным процессам. Это события, критические секции, блокирующие функции, объек­ты Mutex и семафоры.

2.1. Ожидание завершения задачи или процесса

Если нужно дождаться завершения одной задачи или процесса, лучше всего воспользоваться функцией WaitForSingleObject. В качестве параметров этой функции нужно передать идентификатор объекта, для которого меняется ожидание и время, в течение которого выполняется ожидание (ожидание может быть бесконечным, если для времени указать значение INFINITE):

DWORD WaitForSingleObject(

HANDLE hObject, // идентификатор объекта

DWORD dwTimeout); // время ожидания в миллисекундах

Если функция завершилась успешно, она может вернуть одно из следующих

трех значений:

• WAIT_OBJECTJ) - состояние объекта, для которого выполнялось ожидание, стало отмеченным;

• WAIT_TIMEOUT - истекло заданное время ожидания;

• WAIT_ABANDONED - возвращается для объекта синхронизации Mutex

который не был освобожден задачей, завершившей свою работу;

• WAIT_FAILED - произошла ошибка при выполнении функции.

Многие объекты ОС Windows, такие, как идентификаторы задач, про­цессов, файлов, могут находиться в двух состояниях: отмеченном или неот­меченном. Если задача или процесс находится в состоянии выполнения, соот­ветствующие идентификаторы находятся в неотмеченном состоянии. Когда задача или процесс завершают свою работу, их идентификаторы отмечаются. На рис. l показано, как задача с номером l ожидает завершения задача с номером 2.

Задача l

Задача 2

Выполнение длитель­ной работы


Рис.l

Ожидание завершения сразу нескольких задач или процессов можно выполнить с помощью функции WaitForMultipleObject.

DWORD WaitForMultipleObject

DWORDS cOdjects, //количество идентификаторов в массиве

CONST HANDLE *lphObjects, // адрес массива идентификаторов

BOOL fWaitAll, // тип ожидания

DWORD dwTimeout); // время ожидания в миллисекундах

Через параметр *lphObjects можно передать адрес массива идентифика­торов, для которых выполняется ожидание, размер этого массива передается через переменную cObjects.

Если содержимое параметра fWaitAll равно TRUE, задача переводится в состояние ожидания до тех пор, пока все объекты, идентификаторы которых хранятся в массиве lphObjects, не перейдут в отмеченное состояние. В том случае, если значение параметра fWaitAll равно FALSE, ожидание прекраща­ется, если хотя бы один из объектов, для которых выполняется ожидание, пе­рейдет в отмеченное состояние.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]