Мое почтение всем. Читаю о том, когда и как доставляются APC, немного запутался. Есть несколько вопросов. Как я понял, APC бывают трех видов: пользовательские, APC режима ядра и специальные APC режима ядра. Первые доставляются когда поток блокируется на каком-то объекте диспетчеризации, вторые доставляются во время исполнения потока, первые доставляются практически моментально. И все же хотелось бы знать, какое событие приводит к доставке специальных APC ядра и обычных APC ядра. Теперь по поводу KeWaitForSingleObject (и вообще KeWaitXxx и KeDelayExecutionThread) ф-ий. Они имеют два параметра для управления доставки APC -- Alertable & WaitMode. Вот с ними особенная путаница. Зачем было сделано два параметра? В MSDN в описании KeWaitForSingleObject написано следующее: Т.е. достаточно выставить хотя бы один параметр. А из этой таблицы можно сказать, что настоящее влияние на доставку APC имеет WaitMode. Как же рапределить роли между этими параметрами? Подозреваю, что Alertable разрешает/запрещает доставку неких alert'ов -- какой-то внутренний механизм ядра -- но точно не уверен. И еще пара вопросов. Насколько я понимаю, APC ядра и специальные APC ядра не описаны в вышеприведенной таблице, т.к. доставляются прямо в исполняющийся поток, так? Код APC исполняется на APC_LEVEL. Может ли возникнуть следующая ситуация: исполняется код APC. Управление по таймеру переходит на DISPATCH_LEVEL. Планировщик видит, что к исполнению готов другой поток, работающий на PASSIVE_LEVEL. Этот поток запускается. Т.е. получается, что APC_LEVEL может быть прерван и управление может быть передано потоку на PASSIVE_LEVEL? UPD: А, и еще: зачем сообщать спящему потоку, что была доставлена APC? Почему бы просто не уложить его спать, после того как APC была выполнена? Заранее благодарен.
Если очень грубо, то APC доставляется в момент когда происходит переключение в контекст потока, которому послана APC. Вобщем, там всё зависит, от того в каком состоянии поток находится. Если ждёшь в пользовательском режиме, то можно обработать все APC, если в ядре, то пользовательские APC нельзя обработать. Если поток ждёт в не-alertable состоянии, то APC не будут доставлены пока состояние не изменится. Логика обработки событий может быть такая, что либо ждём Н времени, либо до того момента как в APC была выполнена какая-то работа. Итого, по APC читать там http://www.opening-windows.com/techart_windows_vista_apc_internals.htm