Boost C++ Libraries/Boost.Asio

Boost.Asio 개요 - 핵심 개념 및 기능 - 스택형 코-루틴

까마귀75 2020. 12. 10. 11:44
728x90
반응형

스택형 코-루틴 (Stackful Coroutines)

spawn() 함수는 스택형 코-루틴을 실행하기 위한 고수준 래퍼이다. 그것은 Boost.Coroutine 라이브러리를 기반으로 한다. spawn() 함수는 다음 예와 같이 프로그램이 동기식 방식으로 비동기식 로직을 구현할 수 있도록 한다:

 

boost::asio::spawn(my_strand, do_echo);

// ...

void do_echo(boost::asio::yield_context yield)
{
  try
  {
    char data[128];
    for (;;)
    {
      std::size_t length =
        my_socket.async_read_some(
          boost::asio::buffer(data), yield);

      boost::asio::async_write(my_socket,
          boost::asio::buffer(data, length), yield);
    }
  }
  catch (std::exception& e)
  {
    // ...
  }
}

 

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

 

두 번째 인수는 다음과 같이 서명이 있는 함수 개체이다:

 

void coroutine(boost::asio::yield_context yield);

 

코-루틴의 일부로 실행할 코드를 지정한다. yield 파라미터는 다음과 같이 완료 핸들러 대신 비동기 작업에 전달될 수 있다:

 

std::size_t length =
  my_socket.async_read_some(
    boost::asio::buffer(data), yield);

 

이렇게 하면 비동기 작업이 시작되고, 코-루틴은 일시 중단된다. 비동기 작업이 완료되면 코-루틴은 자동으로 다시 시작된다.

 

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

 

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

 

개시 함수는 result_type을 반환한다. 위에 async_read_some 예제에서 이것은 size_t 이다. 비동기 작업이 실패하면 error_codesystem_error 예외로 변환되어 전달(throw)된다.

 

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

 

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

 

개시 함수는 void를 반환한다. 위와 같이 오류는 system_error 예외로 코-루틴에 다시 전달된다.

 

예외를 발생시키지 않고 작업에서 error_code를 수집하려면, 다음과 같이 출력 변수를 yield_context와 연결한다:

 

boost::system::error_code ec;
std::size_t length =
  my_socket.async_read_some(
    boost::asio::buffer(data), yield[ec]);

 

주의: spawn()Handler 유형의 사용자 완료 핸들러와 함께 사용되면, 함수 객체 서명은 실제로 다음과 같다:

 

void coroutine(boost::asio::basic_yield_context<Handler> yield);

 

더 보기

spawn, yield_context, basic_yield_context, Spawn example (C++03), Spawn example (C++11), Stackless Coroutines.

 

 

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

728x90
반응형