핵심 요약
Microsoft Developer의 v2 task_sequencer에서 연쇄적으로 동기 완료되는 작업 시퀀스로 인해 발생하던 스택 오버플로우를 해결하기 위해, 비동기 재개 전략과 UI 스레드 관리 방법을 도입했습니다. co_await suspend 직후 백그라운드 재개를 강제하거나 DispatcherQueue를 통해 UI 스레드로 비동기로 돌아와 스택 언와인드를 유도합니다.
구현 방법
- 문제 원인: 연쇄적으로 즉시 완료되는 작업으로 인해 람다 재개가 중첩되며 스택이 과다하게 쌓이는 현상
- 핵심 구성요소: suspender, chained_task, completer, std::atomic<void*>(next), m_latest 등으로 체인을 관리
- 실행 흐름 요지: suspend를 대기한 후 m_queue 상태에 따라 백그라운드(resume_background) 또는 포그라운드(resume_foreground(local_queue))로 재개하고, 마지막에 local_maker()를 실행
- DispatcherQueue 활용: task_sequencer 생성 시 큐를 전달하여 시작 스레드를 지정하고, nullptr인 경우 백그라운드에서 시작
- 주의사항 및 효과: UI 스레드에서의 비동기 재개로 안정성을 높이나, 단일 스레드 아파트에서 IContextCallback 차단으로 인해 스레드풀 자원 사용이 증가할 수 있음
주요 결과
- 스택 오버플로우 위험 감소 및 비동기 흐름의 안정적 재개 확보
- UI 스레드에 맞춘 실행 흐름으로 동작 예측성 향상
- 단일 스레드 아파트에서의 비용 증가 가능성 등 추가 고려 필요


