Использование семафоров
RTSS-объект семафор является объектом синхронизации, который поддерживает счетчик, значение которого может находиться между нулем и определенным максимальным числом. Счетчик уменьшается на 1 каждый раз, когда функция ожидания объекта семафор (WaitForSingleObject) возвращает управление потоку. Счетчик увеличивается на переменное число при освобождении семафора. Когда счетчик достигает 0, семафор больше не считается свободным и ни один вызов WaitForSingleObject не может вернуть управление потоку, пока какой-либо поток не увеличит счетчик.
Как и обычные Win32 семафоры, RTSS-семафоры используются для учета ресурсов. Они дают возможность потоку запросить свободные ресурсы. Если один или более ресурсов доступны, счетчик свободных ресурсов уменьшается. RTSS-семафоры выполняют эту операцию автоматически, т.е. когда запрашивается ресурс у RTSS-семафора, операционная система проверяет наличие свободных ресурсов и уменьшает их счетчик не позволяя вмешиваться другим потокам. Только после того, как счетчик ресурсов был уменьшен, система позволяет другому потоку затребовать ресурс.
Т.к. несколько потоков могут влиять на счетчик, RTSS-семафором, в отличие от мьютекса, поток владеть не может. Это означает, что WaitForSingleObject, ожидающая семафор:
- Никогда не вернет WAIT_ABANDONED
- Может потерять ресурсы семафора, если потоки прекращают выполнение
- Может позволить произойти инверсии приоритетов
Однако, в отличие от Win32 семафоров, RTSS-семафоры поддерживают “приоритетное ожидание”. Это означает, что когда несколько потоков с различными приоритетами ожидают семафор, система гарантирует, что порядок, в котором потоки будут получать доступ к семафору, соответствует распределению приоритетов процессов в момент освобождения семафора.