Предупреждение NtWaitForKeyedEvent? - PullRequest
2 голосов
/ 08 июля 2011

Я использую события с ключами Windows для пользовательских примитивов синхронизации, вдохновленных http://locklessinc.com/articles/keyed_events/

Чтобы поддержать прерывание потока, я изменил места, где блокирующие вызовы, такие как Sleep или WaitForSingleObject, использовались для их версий с предупреждением, таких как SleepEx и WaitForSingleObjectEx. Затем я могу прервать ожидание, поставив в очередь APC с QueueUserAPC, и, если возвращается WAIT_IO_COMPLETION, я выбрасываю специальное исключение, которое вызывает вызов всех деструкторов и затем выход из потока. Это похоже на версию pthread_cancel () для Linux, которая заставляет стек перематываться и, таким образом, все очищается при выходе из потока.

Я вижу, что NtWaitForKeyedEvent () также имеет параметр Alertable, поэтому мне интересно, могу ли я сделать то же самое для этого случая, или есть предостережения? Если APC разбудит это, я также не знаю, какое возвращаемое значение искать, поскольку NTSTATUS напрямую не соответствует кодам возврата WIN32. Есть STATUS_USER_APC и STATUS_ALERTED, и я не знаю, будет ли это один из этих двух. Если пользовательской функции APC недостаточно для оповещения об ожидаемом событии с ключом, что это такое?

1 Ответ

1 голос
/ 10 октября 2011

NtWaitForKeyedEvent с Altertable = TRUE выглядит так, как будто он будет делать то, что вы хотите.Это параметр, который вы устанавливаете с помощью NtWaitForSingleObject, чтобы также разрешить получение APC.

Вы получите STATUS_USER_APC, если ожидание завершено из-за запуска APC, и STATUS_ALERTED, если NtAlertThread вызывается всвязь с вашей темой.Если все, что вам нужно, это сигнал остановки ожидания, достаточно NtAlertThread.

Если ваш механизм обработки исключений выполняет SEH, вы, вероятно, можете вызвать специальное исключение непосредственно из процедуры APC.

...