
- •Часть 2.
- •Часть 2. Операционная система ms windows
- •1.Мультизадачность. Управление задачами
- •2.Синхронизация задач и процессов
- •2.1. Ожидание завершения задачи или процесса
- •2.2. Синхронизация задач с помощью событий
- •2.3. Последовательный доступ к ресурсам
- •2.4. Блокирующие функции
- •2.5. Синхронизация с использованием семафоров
- •Литература
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, ожидание прекращается, если хотя бы один из объектов, для которых выполняется ожидание, перейдет в отмеченное состояние.