비동기 작업 큐 디자인
이 항목은 Microsoft GDK(게임 개발 키트) 비동기 디자인 패턴과 함께 사용되는 Microsoft GDK(게임 개발 키트) 작업 큐에 대해 설명합니다. 작업 큐는 큐 작업 및 완료 작업 콜백을 위한 API입니다. 작업 큐는 게임 워크로드를 신중하게 관리하기 위해 사용할 수 있는 수동 디스패치 메커니즘을 포함하여 여러 가지 디스패치 모드 중 하나로 구성할 수 있습니다.
작업 큐 API 개요
작업 큐는 작업 포트와 완료 포트라는 두 개의 큐 포트로 구성됩니다. 비동기 작업을 수행하기 위한 작업 포트와 사용자에게 이를 알리는 완료 포트는 모두 자주 필요하기 때문에 이들 포트는 동일한 개체로 묶입니다.
작업 큐에 대한 설명은 다음과 같습니다.
두 개의 작업 큐 포트를 포함합니다.
각 작업 큐에는 큐의 항목이 디스패치되는 방법을 결정하는 자체 디스패치 모드가 있을 수 있습니다.
디스패치 모드는 시스템 스레드 풀을 통한 완전 자동 디스패치부터 작업을 명시적으로 제거해야 하는 완전 수동 디스패치까지 다양합니다.
콜백은 큐의 각 포트로 전송할 수 있습니다.
큐는 핸들로 표시됩니다. 핸들은 중복될 수 있고, 이는 큐 참조 개수를 기본적으로 증가시킵니다.
디스패치 모드를 지정하여 독립적으로 각 작업 큐 포트를 구성할 수 있습니다. 디스패치 모드는 포트에 대기 중인 콜백을 처리하는 방법을 결정합니다. 디스패치 모드에는 여러 가지가 있습니다.
스레드 풀: 스레드 풀 큐에 대기 중인 콜백이 시스템 스레드 풀에서 실행됩니다. 스레드 풀은 호출을 병렬로 호출하며 스레드 풀 스레드를 사용할 수 있게 되면 큐에서 차례로 호출을 실행합니다.
연속 스레드 풀: 콜백은 대기 중이고 스레드 풀에서 실행되지만 모든 스레드 풀 스레드에서 병렬로 실행되는 대신 하나씩 실행됩니다.
수동: 수동 큐에 대기 중인 콜백은 자동으로 디스패치되지 않습니다. 원하는 스레드에서 이를 디스패치하는 것은 귀하의 책임입니다. 수동 작업 큐를 사용하는 경우 Windows 메시지 큐도 펌프해야 합니다.
즉시: 즉시 디스패치 모드는 전혀 대기하지 않습니다. 콜백을 제출한 스레드에서 즉시 호출을 실행합니다.
작업 큐 핸들은 리소스를 공유할 수 있습니다. 핸들을 닫으면 큐에 대한 참조가 해제됩니다. 큐는 모든 참조가 해제될 때까지 실제로 제거되지 않습니다.
XTaskQueueDuplicateHandle
, XTaskQueueSubmitCallback
, XTaskQueueSubmitDelayedCallback
, XTaskQueueCreateComposite
모두는 큐 핸들에 참조를 추가합니다. 즉, 모든 콜백이 완료 될 때까지 큐가 실제로 제거되지 않습니다.
작업 큐 핸들은 프로세스당 리소스이며 마샬링되거나 프로세스 외부에서 사용될 수 없습니다.
사용 패턴
작업 큐의 일반적인 사용 패턴은 다음과 같습니다.
작업 큐 핸들을 만든 후 각 포트에 디스패치 모드를 지정합니다.
수동 디스패치를 사용하는 경우 큐의 디스패치 함수를 호출하기 위한 앱 지정 스레드를 설정합니다.
큐를 Microsoft GDK(게임 개발 키트) 호출에 대한 매개 변수로 사용하거나
XTaskQueueCallback
을(를) 사용하여 직접 제출합니다.선택적으로 앱이 종료 될 때 작업 큐를 종료합니다.
비동기 작업 큐 방법 항목
이 섹션에서는 일반적인 비동기 작업 큐 시나리오에 대한 방법 예제를 제공합니다.
이 섹션의 내용
스레드 풀 작업 큐 만들기
시스템 스레드 풀에서 작업 및 완료 콜백을 모두 전달하는 작업 대기열을 만드는 방법을 보여주는 예제를 제공합니다.
콜백 제출
작업 대기열의 작업 포트 또는 완료 포트에 콜백이 제출되는 방법을 보여주는 예제를 제공합니다.
작업 큐 핸들 복제
작업 큐 핸들 복제를 보여주는 예제를 제공합니다. 장기 실행 작업이 있는 경우 작업 기간 동안 작업 큐 핸들을 복제하려 할 수 있습니다. 이런 방법으로 XTaskQueueCloseHandle
을(를) 호출하면 큐가 필요한 동안에 큐를 닫지 않습니다.
수동 작업 큐 만들기
수동으로 펌핑된 작업 큐 만드는 방법을 보여주는 예시를 제공합니다. 작업 포트 및 완료 포트 모두에 대해 호출을 발송하는 2개의 STL 스레드를 만듭니다.
이벤트 사용으로 수동 큐 디스패치 제어
디스패치 할 항목이있는 경우 작업 큐를 사용하여 조건 변수에 신호를 보내는 방법을 보여주는 예제를 제공합니다.
Windows 메시지 루프와 함께 작업 큐 사용
작업에 스레드 풀을 사용하지만 완료 포트 콜백을 Win32 창 프로세서에 통합하는 예제를 제공합니다. 이 예제에서는 다른 스레딩 모델과 통합하는 경우 작업 큐의 올바른 종료 방법도 보여 줍니다.
프로세스 작업 큐 사용
프로세스 작업 큐를 사용하는 방법을 보여 주는 예제를 제공합니다. 기본 프로세스 작업 큐는 작업과 완료 디스패치 둘 다에 스레드 풀을 사용합니다.
복합 작업 큐 만들기
작업에 스레드 풀을 사용하지만 완료 포트 콜백을 Win32 WindowProc 콜백 함수에 통합하는 예제를 제공합니다. 또한 다른 스레딩 모델과 통합하는 경우 작업 큐의 올바른 종료 방법을 보여줍니다.
지연된 콜백 사용
500ms 간격으로 10개의 콜백을 호출하여 지연된 콜백을 사용하는 방법을 보여 주는 예제를 제공합니다. 작업 큐를 사용하면 나중에 XTaskQueueSubmitDelayedCallback
API를 통해 콜백을 제출할 수 있습니다. 이렇게 하면 실패한 호출을 잠시 후 다시 시도할 수 있으며, 주기적으로 발생하는 이벤트의 저렴한 타이머로 사용할 수도 있습니다.
작업 큐 대기자 사용
작업 큐 대기자를 사용하는 방법을 보여 주는 예제를 제공합니다. 작업 큐에 Win32 커널 핸들을 등록할 수 있습니다. 핸들이 신호를 받으면 콜백이 큐에 제출됩니다.