Объясните плз, почему TEventFlag.Wait() работает по-разному (очищает флаг или нет) в зависимости от того взведен флаг на момент запроса или нет? Я для себя никаких плюсов этого не вижу, а сумятицу в голову (в мою конкретно) вносит. Насколько понял, это сделано для множественной побудки, т.е. если в ожидании уснули вдвоем, то оба и проснутся. Но кто же должен тогда очистить флаг? Оба сразу? А если один из проснувшихся (первый) хочет инициировать новую операцию с новым ожиданием флага, а второй потом проснется и без разбора очистит флаг?
Вообще идея понятна но смущает то, что выйдя из wait() я не знаю, очищен ли уже флаг или нет. А проверять последующим вызовом IsSignaled() уже нельзя, т.к. ее результат может оказаться невалидным, т.к. между wait() и IsSignaled() может что-то произойти, а в критическую секцию их заключить нельзя т.к. возможно ожидание флага от прерывания. Вот и не срастается у меня в голове идеология - как же правильно по задумке автора(ов) работать с флагами?
|