Boost C++ Libraries/Boost.Asio

Boost.Asio 개요 - 핵심 개념 및 기능 - 코-루틴 TS 지원

까마귀75 2020. 12. 10. 13:46
728x90
반응형

코-루틴 TS 지원 (Coroutines TS Support)

코-루틴 TS에 대한 지원은 awaitable 클래스 템플릿, use_awaitable 완료 토큰 그리고 co_spawn() 함수를 통해서 제공된다. 이런 기능으로 프로그램은 다음 예제와 같이 co_await 키워드와 함께 동기식 방식으로 비동기식 로직을 구현할 수 있다:

boost::asio::co_spawn(executor, echo(std::move(socket)), boost::asio::detached);

// ...

boost::asio::awaitable<void> echo(tcp::socket socket)
{
  try
  {
    char data[1024];
    for (;;)
    {
      std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data), boost::asio::use_awaitable);
      co_await async_write(socket, boost::asio::buffer(data, n), boost::asio::use_awaitable);
    }
  }
  catch (std::exception& e)
  {
    std::printf("echo Exception: %s\n", e.what());
  }
}

 

co_spawn()에 첫 번째 인수는 코-루틴이 실행될 수 있는 컨텍스트를 결정하는 실행기(executor)다. 예를 들어, 서버의 클라이언트별 개체는 여러 코-루틴으로 구성될 수 있고, 코-루틴은 동일한 스트랜드(strand)에서 실행되어야 하기에 명시적인 동기화가 필요하지 않다.

 

두 번째 인수는 코-루틴의 진입점 함수(entry point function)의 결과인 awaitable<R>이고, 위의 예제에서 echo 호출의 결과이다. (또는 이 인수는 awaitable<R>을 반환하는 함수 객체일 수도 있다.) 템플릿 파라미터 R은 코-루틴에서 생성된 반환 값의 유형이다. 위의 예에서 코-루틴은 void를 반환한다.

 

세 번째 인수는 완료 토큰이고, co_spawn()에서 void(std::exception_ptr, R) 서명으로 완료 핸들러를 생성하는데 사용한다. 이 완료 핸들러는 코-루틴이 완료되면 코-루틴의 결과와 함께 호출된다. 위의 예에서는 비동기식 작업의 결과를 명시적으로 무시하는 데 사용되는 완료 토큰 유형인 boost::asio::detached를 전달한다.

 

이 예에서 코-루틴의 본문은 echo 함수로 구현된다. use_awaitable 완료 토큰이 비동기식 작업에 전달될 때, 작업의 개시 함수가 co_wait 키워드와 함께 사용할 수 있는 awaitable을 반환한다:

std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data), boost::asio::use_awaitable);

 

비동기식 작업의 핸들러 서명은 다음과 같은 형식이다:

void handler(boost::system::error_code ec, result_type result);

 

co_await 표현식의 결과 유형은 result_type이다. 위의 async_read_some 예제에서 이것은 size_t이다. 비동기식 작업이 실패하면 error_codesystem_error 예외로 변환되어 전달(throw)된다.

 

핸들러 서명 형식은 다음과 같다:

void handler(boost::system::error_code ec);

 

co_await 표현식은 void 결과를 생성한다. 위와 같은 오류는 system_error 예외로서 코-루틴에 다시 전달된다.

더 보기

co_spawn, detached, redirect_error, awaitable, use_awaitable_t, use_awaitable, this_coro::executor, Coroutines TS examples, Stackful Coroutines, Stackless Coroutines.

 

 

핵심 개념 및 기능  Boost.Asio 개요  Boost.Asio 홈

728x90
반응형