47255 (665742), страница 2
Текст из файла (страница 2)
Этот счетчик уменьшается, когда задача вызывает функции ожидания, такие как WaitForSingleObject() или WaitForMultipleObject(). Если задача вызывает несколько раз функцию ожидания для одного и того же семафора, содержимое его счетчика каждый раз будет уменьшаться.
Таким образом, алгоритм работы с семафорами выглядит следующим образом:
-
поток создает или открывает семафор с помощью функций CreateSemaphore() или OpenSemaphore() соответственно;
-
поток вызывает функцию WaitForSingleObject() для того, чтобы определить, свободен ли требуемый потоку ресурс. В зависимости от результата, возвращаемого этой функцией, определяются дальнейшие действия;
-
при завершении поток вызывает функцию ReleaseSemaphore(), освобождающую семафор.
Единственная возможность определения текущего значения счетчика семафора заключается в увеличении этого значения функцией ReleaseSemaphore() Значение счетчика, которое было до увеличения, будет записано в переменную, адрес которой передается функции ReleaseSemaphore() через параметр lplPreviousCount.
Одной из проблем, которая возникает при использовании семафоров является проблема синхронизации – взаимные блокировки (дедлоки, клинчи, тупики).