io_service
이전 버전과 호환성을 위한 typedef 이다.
typedef io_context io_service;
유형
이 름 | 설 명 |
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] |
생성자 (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] |
소멸자 (destructor) |
보호된(protected) 멤버 함수
이 름 | 설 명 |
destroy | context 내의 모든 서비스를 소멸한다. |
shutdown | context 내의 모든 서비스를 종료한다. |
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::acceptor
- 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에 대해 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을 사용하는 경우, 요구 호출의 반환 유형을 계산할 수 있다:
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); ...
또는 유형을 제거한 실행기(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); ...
종료(shutdown) 적용하려면, 응용프로그램이 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_service.hpp
편의 헤더: boost/asio.hpp
Boost.Asio 홈
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 색인 - ip::address_v4_range (0) | 2021.02.01 |
---|---|
Boost.Asio 색인 - ip::address_v4_iterator (0) | 2021.02.01 |
Boost.Asio 색인 - posix::basic_stream_descriptor::io_control (0) | 2021.01.31 |
Boost.Asio 색인 - posix::basic_descriptor::io_control (0) | 2021.01.31 |
Boost.Asio 색인 - basic_stream_socket::io_control (0) | 2021.01.30 |