Boost C++ Libraries/Boost.Asio

Boost.Asio - io_context

까마귀75 2021. 3. 16. 17:04
728x90
반응형

io_context

핵심 I/O 기능을 제공한다.

class io_context :
  public execution_context

유 형

이 름 설 명
basic_executor_type io_context에 함수를 제출하는 데 사용되는 실행기(executor) 구현 유형.
service 모든 io_context 서비스의 기본 클래스.
strand 직렬화 된 처리기 실행을 제공.
work (더 이상 사용되지 않음: executor_work_guard 사용.) 처리할 작업이 있을 때 io_context에 알리는 클래스.
count_type 컨텍스트에서 실행되는 핸들러 수를 계산하는 데 사용되는 유형.
executor_type io_context에 함수를 제출하는 데 사용되는 실행기(executor).
fork_event 포크 관련 이벤트 알림.

멤버 함수

이 름 설 명
dispatch (더 이상 사용되지 않음: boost::asio::dispatch() 사용.) 주어진 핸들러를 호출하도록 io_context에 요청한다.
get_executor io_context와 연결된 실행기(executor)를 얻어온다.
io_context
[constructor]
생성자.
notify_fork 포크 관련 이벤트를 execution_context에 알린다.
poll io_context 개체의 이벤트 처리 루프를 실행하여, 준비된 핸들러를 실행한다.

(더 이상 사용되지 않음: error_code 없는 오버로드 사용.) io_context 개체의 이벤트 처리 루프를 실행하여, 준비된 핸들러를 실행한다.
poll_one io_context 개체의 이벤트 처리 루프를 실행하여, 하나의 준비된 핸들러를 실행한다.

(더 이상 사용되지 않음: error_code 없는 오버로드 사용.) io_context 개체의 이벤트 처리 루프를 실행하여, 하나의 준비된 핸들러를 실행한다.
post (더 이상 사용되지 않음: boost::asio::post() 사용.) 주어진 핸들러를 호출하고 즉시 반환하도록 io_context에게 요청한다.
reset (더 이상 사용되지 않음: restart() 사용.) 이어지는 run() 호출을 준비하기 위해 io_context를 재설정한다.
restart 이어지는 run() 호출을 준비하기 위해 io_context를 다시 시작한다.
run io_context 개체의 이벤트 처리 루프를 실행한다.

(더 이상 사용되지 않음: error_code 없는 오버로드 사용.) io_context 개체의 이벤트 처리 루프를 실행한다.
run_for 지정된 유지 기간 동안 io_context 개체의 이벤트 처리 루프를 실행한다.
run_one io_context 개체의 이벤트 처리 루프를 실행하여, 최대 하나의 핸들러를 실행한다.

(더 이상 사용되지 않음: error_code 없는 오버로드 사용.) io_context 개체의 이벤트 처리 루프를 실행하여, 최대 하나의 핸들러를 실행한다.
run_one_for 지정된 유지 기간 동안 io_context 개체의 이벤트 처리 루프를 실행하여 최대 하나의 핸들러를 실행한다.
run_one_until 지정된 시간까지 io_context 개체의 이벤트 처리 루프를 실행하여 최대 하나의 핸들러를 실행한다.
run_until 지정된 시간까지 io_context 개체의 이벤트 처리 루프를 실행한다.
stop io_context 개체의 이벤트 처리 루프를 중지한다.
stopped io_context 개체가 중지되었는지 확인한다.
wrap (더 이상 사용되지 않음: boost::asio::bind_executor() 사용.) io_context에서 래핑된 핸들러를 자동으로 디스패치하는 새로운 핸들러를 생성한다.
~io_context
[destructor]
소멸자

보호된(protected) 멤버 함수

이 름 설 명
destroy 컨텍스트의 모든 서비스를 제거한다.
shutdown 컨텍스트의 모든 서비스를 종료한다.

Friends

이 름 설 명
add_service (더 이상 사용되지 않음: make_service() 사용.) execution_context에 서비스 개체를 추가한다.
has_service execution_context에 지정된 서비스 유형이 포함되어 있는지 확인한다.
make_service 서비스 개체를 생성하고 execution_context에 추가한다.
use_service

주어진 유형에 해당하는 서비스 개체를 얻어온다.

io_context 클래스는 다음을 포함하여 비동기식 I/O 개체 사용자를 위한 핵심 I/O 기능을 제공한다:

  • boost::asio::ip::tcp::socket
  • boost::asio::ip::tcp::accept
  • boost::asio::ip::udp::socket
  • deadline_timer

io_context 클래스에는 사용자 정의 비동기식 서비스 개발자를 위한 기능도 포함되어 있다.

스레드 안전성

고유 개체: 안전함
공유 개체: 안전함, restart()notify_fork() 함수의 특정한 예외는 제외. 완료되지 않은 run(), run_one(), run_for(), run_until(), poll() 또는 poll_one() 호출이 있는 동안 restart()를 호출하면 정의되지 않은 동작이 발생한다. io_context 함수나 io_context와 연결된 I/O 개체의 함수가 다른 스레드에서 호출되는 동안 notify_fork() 함수는 호출되지 않아야 한다.

동기식과 비동기식 작업

I/O 개체에 대한 동기식 작업은 개별 작업에 대해 io_context 개체를 암시적으로 실행한다. io_context의 함수 run(), run_one(), run_for(), run_until(), poll() 또는 poll_one()을 호출하여 C++ 프로그램을 대신하여 io_context가 비동기식 작업을 수행해야 한다.
비동기식 작업이 완료되었다는 알림은 연결된 핸들러를 호출하여 전달된다. 핸들러는 io_context에 대해 run(), run_one(), run_for(), run_until(), poll() 또는 poll_one()의 오버로드를 호출하는 현재 스레드에 의해서만 호출된다.

핸들러에서 발생한 예외의 영향

핸들러에서 예외가 발생하면, 예외가 발생한 스레드에서 호출한 run(), run_one(), run_for(), run_until(), poll() 또는 poll_one()을 통해 예외가 전파될 수 있다. 이러한 함수를 호출하는 다른 스레드는 영향을 받지 않는다. 그런 다음 예외를 포착하는 일은 응용프로그램의 책임이다.

예외가 포착된 후, restart()를 호출하지 않고 run(), run_one(), run_for(), run_until(), poll() 또는 poll_one()을 호출하여 다시 시작할 수 있다. 이렇게하면 스레드가 풀에 있는 다른 스레드에 영향을 주지 않고 io_context 개체의 스레드 풀에 다시 참여할 수 있다.

예를 들면:

boost::asio::io_context io_context;
...
for (;;)
{
  try
  {
    io_context.run();
    break; // run() exited normally
  }
  catch (my_exception& e)
  {
    // Deal with exception as appropriate.
  }
}

io_context에 임의 작업 제출

io_context에 함수를 제출하려면, dispatch, post 또는 defer 중 사용 가능한 함수를 사용한다.

예를 들면:

void my_task()
{
  ...
}

...

boost::asio::io_context io_context;

// Submit a function to the io_context.
boost::asio::post(io_context, my_task);

// Submit a lambda object to the io_context.
boost::asio::post(io_context,
    []()
    {
      ...
    });

// Run the io_context until it runs out of work.
io_context.run();

실행 중 처리할 작업 부족으로 인한 io_context 중지

일부 응용프로그램은 더 이상 처리할 작업이 없을 때 호출된 io_context 개체의 run()이 반환되지 않도록 해야 할 수 있다. 예를 들어 응용프로그램의 비동기식 작업 전에 시작되는 백그라운드 스레드에서 io_context가 실행되고 있을 수 있다. run() 호출은 io_context에 대해 작업을 추적하는 실행기(executor)를 생성하여 계속 실행될 수 있다:

boost::asio::io_context io_context;
auto work = boost::asio::require(io_context.get_executor(),
    boost::asio::execution::outstanding_work.tracked);
...

자동 변수 유형 추론이 없는 C++03을 사용하는 경우, require 호출의 반환 유형을 계산할 수 있다:

boost::asio::io_context io_context;
typename boost::asio::require_result<
    boost::asio::io_context::executor_type,
    boost::asio::exeution::outstanding_work_t::tracked_t>
  work = boost::asio::require(io_context.get_executor(),
    boost::asio::execution::outstanding_work.tracked);
...

또는 유형을 지운(type-erasing) 실행기(executor) 래퍼인 any_io_executor에 결과를 저장한다:

boost::asio::io_context io_context;
boost::asio::any_io_executor work
  = boost::asio::require(io_context.get_executor(),
      boost::asio::execution::outstanding_work.tracked);
...

종료하려면, 응용프로그램이 io_context 개체의 stop() 멤버 함수를 호출해야 한다. 이로 인해 io_context run() 호출이 가능한 빨리 반환되어 완료되지 않은 작업을 포기하고 준비된 핸들러의 처리를 허용하지 않는다.

또는 응용프로그램에서 모든 작업과 핸들러를 정상적으로 완료될 수 있도록 하려면, 작업-추적 실행기(executor)를 명시적으로 재설정할 수 있도록 any_io_executor 개체에 저장한다.

boost::asio::io_context io_context;
boost::asio::any_io_executor work
  = boost::asio::require(io_context.get_executor(),
      boost::asio::execution::outstanding_work.tracked);
...
work = boost::asio::any_io_executor(); // Allow run() to exit.

요구 사항

일반 헤더: boost/asio/io_context.hpp
편의 헤더: boost/asio.hpp

Boost.Asio 홈

728x90
반응형