Я использую события с ключами 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 недостаточно для оповещения об ожидаемом событии с ключом, что это такое?