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 홈
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio - strand (0) | 2021.03.17 |
---|---|
Boost.Asio - associated_executor (0) | 2021.03.17 |
Boost.Asio 색인 - yield_context (0) | 2021.03.12 |
Boost.Asio 색인 - windows::basic_random_access_handle::write_some_at (0) | 2021.03.12 |
Boost.Asio 색인 - windows::basic_stream_handle::write_some (0) | 2021.03.12 |