socket과 바인딩되어 socket의 이벤트를 처리
작업을 비동기적으로 수행하며, thread safe 함
보통 작업은 아래와 같이 요청을 하면, 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);
아래의 방식이 비동기적 실행인데, 값이 반환되기까지 기다리지 않고, 다른작업을 동시에 수행
요청 작업이 완료되면, 요청시 등록한 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);
이 객체는 비동기처리를 위한 event loop에 필요한 상태 및 platform dependent한 호출들을 포함하고 있음.
platform dependent한 호출?
epoll이나 select같이 OS마다 다른 호출
io_context는 직접 I/O를 수행하지 않으며, 단지 I/O가 끝나면 callback을 수행하는 역할을 함
개별 객체 : safe
공유 객체 : restart(), notify_fork() 의 특정 예외를 제외하면 safe
restart() : io_context 재시작
notify_fork(): exectuion_context에 대한 이벤트를 알림
즉, 다른 thread의 수행에 영향을 끼치는 경우
예외는 run(), run_one(), run_for(), run_until(), poll() 또는 poll_one()을 통해 호출한 thread에만 전파(propagate)됨
즉 해당 handler에 대한 예외 처리는 해당 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();
socket이나 acceptor에 io_context가 필드로 존재하며, 해당 io_context를 이용해 수행
요청이나 응답이 있기 전까지 다른 요청을 처리하고 있은 이후 io_context의 event를 수행