[c++] 코루틴을 사용한 비동기 작업 처리

본 포스트에서는 C++에서 코루틴을 활용하여 비동기 작업을 처리하는 방법에 대해 다룹니다.

코루틴이란?

코루틴은 함수의 실행을 일시 중단하고 나중에 재개할 수 있는 구조를 갖춘 기능입니다. 이를 통해 비동기 작업 처리와 관련된 복잡한 코드를 더욱 간단하게 작성할 수 있습니다.

C++에서 코루틴 사용하기

C++ 20부터는 코루틴을 공식적으로 지원하기 시작했습니다. 아래는 코루틴을 사용하여 비동기 작업을 처리하는 간단한 예제 코드입니다.

#include <iostream>
#include <coroutine>
#include <chrono>

struct Task {
    struct promise_type {
        auto initial_suspend() { return std::suspend_always{}; }
        auto final_suspend() noexcept { return std::suspend_always{}; }
        Task get_return_object() { return Task{std::coroutine_handle<promise_type>::from_promise(*this)}; }
        void return_void() {}
        void unhandled_exception() { std::terminate(); }
    };

    std::coroutine_handle<promise_type> coro;

    explicit Task(std::coroutine_handle<promise_type> c) : coro(c) {}

    ~Task() {
        if (coro) coro.destroy();
    }
};

Task asynchronousTask() {
    co_await std::suspend_always{};
    std::cout << "비동기 작업 시작" << std::endl;
    co_await std::suspend_always{};
    std::cout << "비동기 작업 완료" << std::endl;
}

int main() {
    Task task = asynchronousTask();
    task.coro.resume();
    std::cout << "메인 작업 진행 중" << std::endl;
}

위 예제 코드에서는 asynchronousTask 함수를 코루틴으로 정의하고, 메인 함수에서 해당 코루틴을 호출하고 진행하는 방법을 보여줍니다.

마치며

코루틴은 C++에서 비동기 작업을 간단하게 다룰 수 있도록 도와주는 강력한 기능입니다. 본 포스트를 통해 코루틴의 기본 개념과 활용 방법에 대해 간략히 살펴보았습니다. 추가적인 자세한 내용은 C++ 코루틴에 관한 공식 문서를 참고하시기를 권장합니다.

참고 자료