> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 비동기 작업 큐 설계

> 비동기 작업 큐 설계

이 항목에서는 Microsoft Game Development Kit(GDK) 비동기 설계 패턴과 함께 사용되는 Microsoft Game Development Kit(GDK) 작업 큐에 대해 설명합니다. *작업 큐*는 작업 및 완료 태스크 콜백을 큐에 넣기 위한 API입니다. 작업 큐는 게이밍 워크로드를 신중하게 관리하는 데 사용할 수 있는 수동 디스패치 메커니즘을 포함하여 몇 가지 서로 다른 디스패치 모드 중 하나로 구성할 수 있습니다.

## 작업 큐 API 개요

작업 큐는 두 개의 큐 포트, 즉 작업 포트와 완료 포트로 구성된 복합체입니다. 이러한 포트는 종종 둘 다 필요하기 때문에 동일한 개체에 번들로 묶여 있습니다. 즉, 비동기 작업 수행을 위한 작업 포트와 사용자에게 알리기 위한 완료 포트입니다.

작업 큐는 다음과 같이 설명됩니다.

* 두 개의 작업 큐 포트를 포함합니다.

* 각 작업 큐 포트는 큐의 항목이 디스패치되는 방식을 지정하는 자체 디스패치 모드를 가질 수 있습니다.

* 디스패치 모드는 시스템 스레드 풀을 통한 완전 자동 디스패치부터 태스크를 명시적으로 제거해야 하는 완전 수동 디스패치까지 다양합니다.

* 콜백은 큐의 어느 포트에나 제출할 수 있습니다.

* 큐는 핸들로 표현됩니다. 핸들은 복제할 수 있으며, 이는 본질적으로 큐의 참조 카운트를 증가시킵니다.

디스패치 모드를 지정하여 각 작업 큐 포트를 독립적으로 구성할 수 있습니다. *디스패치 모드*는 포트에 큐잉된 콜백이 처리되는 방식을 결정합니다. 여러 가지 디스패치 모드가 있습니다.

* **스레드 풀(Thread Pool):** 스레드 풀 큐에 큐잉된 콜백은 시스템 스레드 풀에서 실행됩니다. 스레드 풀은 스레드 풀 스레드가 사용 가능해질 때마다 큐에서 호출을 하나씩 가져와 병렬로 호출합니다.

* **직렬화된 스레드 풀(Serialized Thread Pool):** 콜백이 큐잉되어 스레드 풀에서 실행되지만, 모든 스레드 풀 스레드에서 병렬로 실행되는 대신 차례대로 실행됩니다.

* **수동(Manual):** 수동 큐에 큐잉된 콜백은 자동으로 디스패치되지 않습니다. 원하는 스레드에서 이를 디스패치하는 것은 사용자의 몫입니다. 수동 작업 큐를 사용하는 경우 Windows 메시지 큐도 펌프해야 합니다.

* **즉시(Immediate):** 즉시 디스패치 모드는 큐잉을 전혀 하지 않습니다. 콜백을 제출한 스레드에서 즉시 호출을 실행합니다.

작업 큐 핸들은 공유 가능한 리소스입니다. 핸들을 닫으면 큐에 대한 참조가 해제됩니다. 모든 참조가 해제될 때까지 큐는 실제로 소멸되지 않습니다. `XTaskQueueDuplicateHandle`, `XTaskQueueSubmitCallback`, `XTaskQueueSubmitDelayedCallback` 및 `XTaskQueueCreateComposite`는 모두 큐 핸들에 참조를 추가합니다. 즉, 모든 콜백이 완료될 때까지 큐가 실제로 소멸되지 않습니다.

작업 큐 핸들은 프로세스별 리소스이며 프로세스 외부에서 마샬링하거나 사용할 수 없습니다.

### 사용 패턴

작업 큐의 일반적인 사용 패턴은 다음과 같습니다.

1. 작업 큐 핸들을 만들고 각 포트에 대한 디스패치 모드를 지정합니다.

2. 수동 디스패치를 사용하는 경우, 큐의 디스패치 함수를 호출하기 위한 앱 관련 스레드를 설정합니다.

3. Microsoft Game Development Kit(GDK) 호출에 매개 변수로 큐를 사용하거나 `XTaskQueueCallback`을 사용하여 직접 제출합니다.

4. 선택적으로, 앱이 종료될 때 작업 큐를 종료합니다.

### 비동기 작업 큐 방법 항목

이 섹션에서는 일반적인 비동기 작업 큐 시나리오에 대한 방법 예제를 제공합니다.

## 이 섹션의 내용

[스레드 풀 작업 큐 만들기](/build/core-features/common/async/async-task-queue-design-howto/creating-thread-pool-task-queue)
시스템 스레드 풀에서 작업 콜백과 완료 콜백을 모두 디스패치하는 작업 큐를 만드는 방법을 보여 주는 예를 제공합니다.

[콜백 제출](/build/core-features/common/async/async-task-queue-design-howto/submitting-callbacks)
작업 큐의 작업 포트 또는 완료 포트에 콜백이 어떻게 제출되는지 보여 주는 예를 제공합니다.

[작업 큐 핸들 복제](/build/core-features/common/async/async-task-queue-design-howto/duplicating-task-queue-handle)
작업 큐 핸들을 복제하는 방법을 보여 주는 예를 제공합니다. 오래 실행되는 작업이 있는 경우 작업 기간 동안 작업 큐 핸들을 복제할 수 있습니다. 이렇게 하면 여전히 큐가 필요한 상태에서 누군가 `XTaskQueueCloseHandle`을 호출해도 큐가 닫히지 않습니다.

[수동 작업 큐 만들기](/build/core-features/common/async/async-task-queue-design-howto/creating-manual-task-queue)
수동으로 펌프되는 작업 큐를 만드는 방법을 보여 주는 예를 제공합니다. 작업 포트와 완료 포트 모두에 대한 호출을 디스패치하는 두 개의 STL 스레드를 만듭니다.

[이벤트를 사용하여 수동 큐 디스패치 제어](/build/core-features/common/async/async-task-queue-design-howto/control-manual-queue-dispatching)
작업 큐가 디스패치할 항목이 있을 때 조건 변수에 신호를 보내기 위해 작업 큐를 사용하는 방법을 보여 주는 예를 제공합니다.

[Windows 메시지 루프와 함께 작업 큐 사용](/build/core-features/common/async/async-task-queue-design-howto/task-queue-windows-msg-loop)
작업에는 스레드 풀을 사용하지만 완료 포트 콜백을 Win32 창 프로시저에 통합하는 예를 제공합니다. 이 예에서는 또한 작업 큐를 다른 스레딩 모델과 통합할 때 작업 큐를 올바르게 종료하는 방법을 보여 줍니다.

[프로세스 작업 큐 사용](/build/core-features/common/async/async-task-queue-design-howto/using-process-task-queue)
프로세스 작업 큐를 사용하는 방법을 보여 주는 예를 제공합니다. 기본 프로세스 작업 큐는 작업 및 완료 디스패치 모두에 스레드 풀을 사용합니다.

[복합 작업 큐 만들기](/build/core-features/common/async/async-task-queue-design-howto/creating-composite-task-queue)
작업에는 스레드 풀을 사용하지만 완료 포트 콜백을 Win32 WindowProc 콜백 함수에 통합하는 예를 제공합니다. 이 예에서는 또한 작업 큐를 다른 스레딩 모델과 통합할 때 작업 큐를 올바르게 종료하는 방법을 보여 줍니다.

[지연된 콜백 사용](/build/core-features/common/async/async-task-queue-design-howto/using-delayed-callbacks)
지연된 콜백을 사용하는 방법을 보여 주는 예로, 500ms마다 한 번씩 10개의 콜백을 호출합니다. `XTaskQueueSubmitDelayedCallback` API를 사용하여 작업 큐에 향후에 실행할 콜백을 제출합니다. 이를 통해 짧은 지연 후 실패한 호출을 다시 시도하거나, 주기적인 이벤트를 위한 저렴한 타이머로 사용할 수 있습니다.

[작업 큐 대기자 사용](/build/core-features/common/async/async-task-queue-design-howto/using-task-queue-waiter)
작업 큐 대기자를 사용하는 방법을 보여 주는 예를 제공합니다. 작업 큐에 Win32 커널 핸들을 등록할 수 있습니다. 핸들이 신호를 받으면 콜백이 큐에 제출됩니다.

## 참고 API 문서

* [XTaskQueue(API 콘텐츠)](/reference/system/xtaskqueue/xtaskqueue_members)


## Related topics

- [비동기 프로그래밍 모델](/ko/build/core-features/common/async/async-programming-model.md)
- [비동기 프로그래밍 개요](/ko/build/core-features/common/async/async-toc.md)
- [XBOX GDK의 비동기 프로그래밍 모델](/ko/build/core-features/common/async/index.md)
- [XBOX Services API(XSAPI) 사용 방법](/ko/services/xbox-services/fundamentals/xbox-services-api/live-gs-xbl-apis.md)
- [일반 비동기 작업 래퍼](/ko/build/core-features/common/async/async-task-function-example.md)
