david's daily developer note

[Native] APC (Asynchronous Procedure Call) 본문

[Develop] Native/Native

[Native] APC (Asynchronous Procedure Call)

mouse-david 2018. 8. 14. 16:59
728x90

새로운 버전의 SDK에서 APC를 조작할 수 있는 인터페이스가 추가되어
간략하게 개념 정리를 해보려한다.

APC는 Asynchronous Procedure Call의 약자이다. 
함수를 직접 호출하는(synchronous) 방식과 다르게 특정 시점에 불리는 Callback과 같다.
APC는 스레드의 특정상태에서 불리는 Callback을 등록하며, 등록 대상이된 스레드가 호출하는 것을 보장한다.

스레드 호출 보장은 어떻게 가능할까?
윈도우 스레드는 개별적으로 APC Queue를 가지고 있기 때문에, 구분하여 적재 가능하다.
APC Queue 적재는 아래 API를 사용한다. (인자는 순서대로 CALLBACK 함수, 스레드핸들, 파라메터이다.)

WINBASEAPI

DWORD WINAPI
QueueUserAPC(
    _In_ PAPCFUNC pfnAPC,
    _In_ HANDLE hThread,
    _In_ ULONG_PTR dwData
    );

APC Queue에 적재된 노드는 언제 호출될까?
APC Queue의 노드는 해당 스레드가 Alertable 상태일 때, 순차적으로 호출한다.
Alertable 상태는 다음의 함수들을 호출하여 만들수있다.

::WaitForSingleObjectEx ( .. _In_ BOOL bAlertable )
::WaitForMultipleObjectsEx ( ..  _In_ BOOL bAlertable )
::SleepEx (..  _In_ BOOL bAlertable )


https://docs.microsoft.com/en-us/windows/desktop/sync/asynchronous-procedure-calls



728x90