boost/asio : io_context

Seongho Jang·2024년 5월 31일

media_stream

목록 보기
1/1

boost/asio : io_context

socket과 바인딩되어 socket의 이벤트를 처리

작업을 비동기적으로 수행하며, thread safe 함

동기적 실행(Synchronous Operation)

보통 작업은 아래와 같이 요청을 하면, return 받기 전까지 대기하는 동기적실행임

boost::asio::io_context io_context;
boost::systesm::error_code err_code;
boost::asio::ip::tcp::socket socket(io_context);
// 값이 return 되기 전까지 대기
socket.connect(server_endpoint, err_code);

비동기적 실행 (Asynchronous Operations)

아래의 방식이 비동기적 실행인데, 값이 반환되기까지 기다리지 않고, 다른작업을 동시에 수행

요청 작업이 완료되면, 요청시 등록한 callback(Completion Handler)을 호출하여 결과를 처리

boost::asio::io_context io_context;
boost::asio::ip::tcp::socket socket(io_context);
// 동작 완료 후 callback_function 수행
socket.async_connect(server_endpoint, callback_function);
void callback_function(const boost::system::error_code& ec);

io_context

이 객체는 비동기처리를 위한 event loop에 필요한 상태 및 platform dependent한 호출들을 포함하고 있음.

platform dependent한 호출?

​ epoll이나 select같이 OS마다 다른 호출

io_context는 직접 I/O를 수행하지 않으며, 단지 I/O가 끝나면 callback을 수행하는 역할을 함


스레드 안정성(Thread Safety)

  • 개별 객체 : safe

  • 공유 객체 : restart(), notify_fork() 의 특정 예외를 제외하면 safe

    restart() : io_context 재시작

    notify_fork(): exectuion_context에 대한 이벤트를 알림

    ​ 즉, 다른 thread의 수행에 영향을 끼치는 경우


Handler에서 발생한 예외(Effect of Exceptions thrown from handlers)

예외는 run(), run_one(), run_for(), run_until(), poll() 또는 poll_one()을 통해 호출한 thread에만 전파(propagate)됨

즉 해당 handler에 대한 예외 처리는 해당 io_context가 실행된 스레드에서 처리해야 함

임의의 callback 등록(Submitting arbitrary tasks to the io_context)

io_context.run()과 같은 호출이 있을 시 수행하는 callback을 등록 할 수 있음

void my_task()
{ ... }
boost::asio::io_context io_ctx;

boost::asio::post(io_ctx, my_task);
boost::asio::post(io_ctx, [](){ ... });

io_ctx.run();

그럼 .asyncconnect()를 비롯한 async*()은 어떤 방식으로 동작하는가?

  • socket이나 acceptor에 io_context가 필드로 존재하며, 해당 io_context를 이용해 수행

  • 요청이나 응답이 있기 전까지 다른 요청을 처리하고 있은 이후 io_context의 event를 수행

0개의 댓글