На главную
При создании многопоточных приложений необходимо контролировать
взаимодействие отдельных потоков. Большинство ошибок при работе с
потоками возникает из-за того, что во время работы приложения различные
потоки пытаются обратиться к одним и тем же данным. Для предотвращения
подобной ситуации в ОС Windows (как впрочем и в других операционных
системах) существуют средства синхронизации, которые позволяют
контролировать доступ к разделяемым ресурсам.
Для обеспечения синхронного взаимодействия потоков создаются объекты
синхронизации, используемые в так называемых wait-функциях, которые
приостанавливают выполнение потока до тех пор, пока не будет выполнено
определенное условие (оно зависит от типа wait-функции).
В Windows существует три группы wait-функций:
1) single-object
К этой группе относится функция WaitForSingleObject(),
которая приостанавливает поток до освобождения заданного объекта
синхронизации.
Параметр hHandle - это
дескриптор объекта синхронизации.
Параметр dwMilliseconds
указывает время, по истечении которого функция завершается, даже если
объект синхронизации не освободился. В этом случае функция возвращает
значение WAIT_TIMEOUT.
2) multiple-object
Функции этой группы позволяют потоку ждать освобождения или нескольких
объектов синхронизации, или одного из них. К этой группе относится
функция WaitForMultipleObjects().
Параметр nCount указывает
количество дескрипторов объектов, содержащихся в массиве, на который
указывает параметр lpHandles.
Максимально возможное число дескрипторов объектов равно константе
MAXIMUM_WAIT_OBJECTS.
Параметр lpHandles - указатель
на массив, в котором содержаться дескрипторы объектов синхронизации.
Параметр bWaitAll - если этот
параметр равен TRUE, то функция возвращает управление потоку, когда
освобождаются все объекты синхронизации, дескрипторы которых содержатся
в массиве. Если параметр равен FALSE, то функция завершается при
освобождении любого из объектов.
Параметр dwMilliseconds
указывает время, по истечении которого функция завершается, даже если
объект синхронизации не освободился. В этом случае функция возвращает
значение WAIT_TIMEOUT.
3) сигнализирующие
(alertable).
При вызове любой wait-функции
можно задавать время ожидания, по истечении которого функция
завершается, не дождавшись выполнения заданного условия, и возвращает
потоку значение WAIT_TIMEOUT.