Asynchronní volání procedur
asynchronní volání procedury (APC) je funkce, která se spouští asynchronně v kontextu konkrétního vlákna. Když je APC zařazen do fronty do vlákna, systém vydá přerušení softwaru. Při příštím naplánování vlákna se spustí funkce APC. APC vygenerovaný systémem se nazývá režim jádra APC. APC vygenerovaný aplikací se nazývá uživatelský režim APC. Vlákno musí být ve stavu výstrahy, aby bylo možné spustit APC v uživatelském režimu.
Každé vlákno má vlastní frontu APC. Aplikace zařadí APC do vlákna voláním funkce QueueUserAPC. Volající vlákno určuje adresu funkce APC ve volání QueueUserAPC. Řazení front APC je požadavek na volání funkce APC ve vlákně.
Pokud je APC v uživatelském režimu zařazen do fronty, vlákno, do kterého je zařazeno do fronty, není směrováno k volání funkce APC, pokud není ve stavu výstrah. Vlákno při volání SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsExnebo WaitForSingleObjectEx funkce. Pokud je čekání splněné před frontou APC, vlákno už není ve stavu výstrahovatelného čekání, takže se funkce APC nespustí. APC je ale stále zařazen do fronty, takže funkce APC se spustí, když vlákno volá jinou upozorňující funkci čekání.
ReadFileEx, SetWaitableTimer, SetWaitableTimerExa WriteFileEx funkce jsou implementovány pomocí APC jako mechanismus zpětného volání oznámení dokončení.
Pokud používáte fond vláken , mějte na paměti, že apcs nefungují ani jiné mechanismy signalizace, protože systém řídí životnost vláken fondu vláken, takže je možné, aby vlákno bylo ukončeno před doručením oznámení. Místo použití mechanismu signalizace založeného na APC, jako je pfnCompletionRoutine parametru SetWaitableTimer nebo SetWaitableTimerEx, použijte čekaný objekt, jako je časovač vytvořený pomocí CreateThreadpoolTimer. Pro vstupně-výstupní operace použijte objekt pro doplňování vstupně-výstupních operací vytvořený pomocí CreateThreadpoolIo nebo hEventPŘEKRÝVAJÍCÍ se struktury, kde lze událost předat funkci SetThreadpoolWait.
Interní informace o synchronizaci
Při vystavení V/V požadavku se přidělí struktura představující požadavek. Tato struktura se nazývá paket požadavků na vstupně-výstupní operace (IRP). V případě synchronních vstupně-výstupních operací vlákno sestaví IRP, odešle ho do zásobníku zařízení a počká v jádru, až se vstupně-výstupní operace dokončí. Pomocí asynchronních vstupně-výstupních operací vlákno sestaví IRP a odešle ho do zásobníku zařízení. Zásobník může okamžitě dokončit IRP nebo může vrátit nevyřízený stav, který indikuje, že žádost probíhá. Pokud k tomu dojde, IRP je stále přidružen k vláknu, takže bude zrušena, pokud vlákno ukončí nebo zavolá funkci, jako je CancelIo. Mezitím může vlákno pokračovat v provádění dalších úloh, zatímco zásobník zařízení bude i nadále zpracovávat IRP.
Existuje několik způsobů, jak může systém znamenat, že se IRP dokončilo:
- Aktualizujte překrývající se strukturu s výsledkem operace, aby vlákno bylo možné dotazovat, zda byla operace dokončena.
- Signalizuje událost v překrývající se struktuře, aby vlákno bylo možné synchronizovat s událostí a být probuzen po dokončení operace.
- Zařadíte vstupně-výstupní operace do fronty do čekajícího protokolu APC vlákna, aby vlákno spustilo rutinu APC, když přejde do stavu čekání a vrátí se z operace čekání se stavem, který označuje, že spustil jednu nebo více rutin APC.
- Zařadíte IRP do fronty na port pro dokončení vstupně-výstupních operací, kde bude spuštěno dalším vláknem, které čeká na port dokončení.
Vlákna, která čekají na port dokončení vstupně-výstupních operací, nečeká ve stavu výstrahy. Proto pokud tato vlákna vydávají protokoly IRPs, které jsou nastaveny tak, aby byly dokončeny jako apcs pro vlákno, tyto dokončování IPC nebudou probíhat včas; k nim dojde pouze v případě, že vlákno převezme požadavek z portu pro dokončení vstupně-výstupních operací a pak se stane, že zadá výstrahu čekání.
Související témata