작업 큐 API 개요
작업 큐는 두 개의 큐 포트, 즉 작업 포트와 완료 포트로 구성된 복합체입니다. 이러한 포트는 종종 둘 다 필요하기 때문에 동일한 개체에 번들로 묶여 있습니다. 즉, 비동기 작업 수행을 위한 작업 포트와 사용자에게 알리기 위한 완료 포트입니다. 작업 큐는 다음과 같이 설명됩니다.- 두 개의 작업 큐 포트를 포함합니다.
- 각 작업 큐 포트는 큐의 항목이 디스패치되는 방식을 지정하는 자체 디스패치 모드를 가질 수 있습니다.
- 디스패치 모드는 시스템 스레드 풀을 통한 완전 자동 디스패치부터 태스크를 명시적으로 제거해야 하는 완전 수동 디스패치까지 다양합니다.
- 콜백은 큐의 어느 포트에나 제출할 수 있습니다.
- 큐는 핸들로 표현됩니다. 핸들은 복제할 수 있으며, 이는 본질적으로 큐의 참조 카운트를 증가시킵니다.
- 스레드 풀(Thread Pool): 스레드 풀 큐에 큐잉된 콜백은 시스템 스레드 풀에서 실행됩니다. 스레드 풀은 스레드 풀 스레드가 사용 가능해질 때마다 큐에서 호출을 하나씩 가져와 병렬로 호출합니다.
- 직렬화된 스레드 풀(Serialized Thread Pool): 콜백이 큐잉되어 스레드 풀에서 실행되지만, 모든 스레드 풀 스레드에서 병렬로 실행되는 대신 차례대로 실행됩니다.
- 수동(Manual): 수동 큐에 큐잉된 콜백은 자동으로 디스패치되지 않습니다. 원하는 스레드에서 이를 디스패치하는 것은 사용자의 몫입니다. 수동 작업 큐를 사용하는 경우 Windows 메시지 큐도 펌프해야 합니다.
- 즉시(Immediate): 즉시 디스패치 모드는 큐잉을 전혀 하지 않습니다. 콜백을 제출한 스레드에서 즉시 호출을 실행합니다.
XTaskQueueDuplicateHandle, XTaskQueueSubmitCallback, XTaskQueueSubmitDelayedCallback 및 XTaskQueueCreateComposite는 모두 큐 핸들에 참조를 추가합니다. 즉, 모든 콜백이 완료될 때까지 큐가 실제로 소멸되지 않습니다.
작업 큐 핸들은 프로세스별 리소스이며 프로세스 외부에서 마샬링하거나 사용할 수 없습니다.
사용 패턴
작업 큐의 일반적인 사용 패턴은 다음과 같습니다.- 작업 큐 핸들을 만들고 각 포트에 대한 디스패치 모드를 지정합니다.
- 수동 디스패치를 사용하는 경우, 큐의 디스패치 함수를 호출하기 위한 앱 관련 스레드를 설정합니다.
-
Microsoft Game Development Kit(GDK) 호출에 매개 변수로 큐를 사용하거나
XTaskQueueCallback을 사용하여 직접 제출합니다. - 선택적으로, 앱이 종료될 때 작업 큐를 종료합니다.
비동기 작업 큐 방법 항목
이 섹션에서는 일반적인 비동기 작업 큐 시나리오에 대한 방법 예제를 제공합니다.이 섹션의 내용
스레드 풀 작업 큐 만들기 시스템 스레드 풀에서 작업 콜백과 완료 콜백을 모두 디스패치하는 작업 큐를 만드는 방법을 보여 주는 예를 제공합니다. 콜백 제출 작업 큐의 작업 포트 또는 완료 포트에 콜백이 어떻게 제출되는지 보여 주는 예를 제공합니다. 작업 큐 핸들 복제 작업 큐 핸들을 복제하는 방법을 보여 주는 예를 제공합니다. 오래 실행되는 작업이 있는 경우 작업 기간 동안 작업 큐 핸들을 복제할 수 있습니다. 이렇게 하면 여전히 큐가 필요한 상태에서 누군가XTaskQueueCloseHandle을 호출해도 큐가 닫히지 않습니다.
수동 작업 큐 만들기
수동으로 펌프되는 작업 큐를 만드는 방법을 보여 주는 예를 제공합니다. 작업 포트와 완료 포트 모두에 대한 호출을 디스패치하는 두 개의 STL 스레드를 만듭니다.
이벤트를 사용하여 수동 큐 디스패치 제어
작업 큐가 디스패치할 항목이 있을 때 조건 변수에 신호를 보내기 위해 작업 큐를 사용하는 방법을 보여 주는 예를 제공합니다.
Windows 메시지 루프와 함께 작업 큐 사용
작업에는 스레드 풀을 사용하지만 완료 포트 콜백을 Win32 창 프로시저에 통합하는 예를 제공합니다. 이 예에서는 또한 작업 큐를 다른 스레딩 모델과 통합할 때 작업 큐를 올바르게 종료하는 방법을 보여 줍니다.
프로세스 작업 큐 사용
프로세스 작업 큐를 사용하는 방법을 보여 주는 예를 제공합니다. 기본 프로세스 작업 큐는 작업 및 완료 디스패치 모두에 스레드 풀을 사용합니다.
복합 작업 큐 만들기
작업에는 스레드 풀을 사용하지만 완료 포트 콜백을 Win32 WindowProc 콜백 함수에 통합하는 예를 제공합니다. 이 예에서는 또한 작업 큐를 다른 스레딩 모델과 통합할 때 작업 큐를 올바르게 종료하는 방법을 보여 줍니다.
지연된 콜백 사용
지연된 콜백을 사용하는 방법을 보여 주는 예로, 500ms마다 한 번씩 10개의 콜백을 호출합니다. XTaskQueueSubmitDelayedCallback API를 사용하여 작업 큐에 향후에 실행할 콜백을 제출합니다. 이를 통해 짧은 지연 후 실패한 호출을 다시 시도하거나, 주기적인 이벤트를 위한 저렴한 타이머로 사용할 수 있습니다.
작업 큐 대기자 사용
작업 큐 대기자를 사용하는 방법을 보여 주는 예를 제공합니다. 작업 큐에 Win32 커널 핸들을 등록할 수 있습니다. 핸들이 신호를 받으면 콜백이 큐에 제출됩니다.
