Как обрабатывать семафор после WAIT_TIMEOUT - PullRequest
0 голосов
/ 04 августа 2020

В настоящее время я работаю над проектом C ++, в котором был создан семафор, используя указанный ниже API.

m_hSem = ::CreateSemaphore(NULL, 0, 1, NULL);

И проверяю объект сигнализации на тайм-аут с помощью указанного ниже API. мне нужно освободить семафор?

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Если истекло время ожидания, нужно ли мне освобождать семафор?

Нет, поскольку ожидание не привело к успешному уменьшению счетчика семафора, поэтому не отпускайте семафор для увеличения его счетчика . Вызов ReleaseSemaphore() только в том случае, если WaitForSingleObject() вернул WAIT_OBJECT_0.

Из документации Microsoft Семафорные объекты :

Семафорный объект - это объект синхронизации, который поддерживает счет от нуля до указанного максимального значения. Счетчик уменьшается каждый раз, когда поток завершает ожидание объекта семафора, и увеличивается каждый раз, когда поток освобождает семафор . Когда счетчик достигает нуля, никакие потоки не могут успешно ждать, пока состояние объекта семафора станет сигнальным. Состояние семафора устанавливается на сигнальное, когда его счетчик больше нуля, и на несигнальный, когда его счетчик равен нулю .

...

Каждый раз, когда один из функции ожидания возвращаются, поскольку состояние семафора было установлено на сигнальное , счетчик семафора уменьшается на единицу. Функция ReleaseSemaphore увеличивает количество семафоров на указанную величину.

0 голосов
/ 04 августа 2020

Если истекло время ожидания, нужно ли мне освобождать семафор?

Нет. В этом случае ожидание считается неудачным.

Документация немного вводит в заблуждение по формулировке, но код примера достаточно ясен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...