동시성 힌트 (Concurrency Hints) io_context 생성자는 프로그램에서 동시성 힌트를 지정할 수 있도록 한다. 이는 완료 핸들러의 실행에 사용되는 활성 스레드 수에 대한 io_context 구현에 대한 제안이다. Windows I/O 완료 포트 백엔드(completion port backend)가 사용 중이면, 이 값은 CreateIoCompletionPort에 전달된다. Reactor 기반 백엔드가 사용되는 경우, 구현은 다음과 같은 특수 동시성 힌트 값을 인식한다. 값 설명 1 구현에서는 io_context가 단일 스레드에서 실행되는 것으로 가정하고, 이 가정에 따라 여러 최적화를 적용한다. 예를 들어, 핸들러가 다른 핸들러내에서 게시되면, 새로운 핸들러는 빠른 스레드 지역(thre..
핸들러 추적 (Handler Tracking) 비동기식 프로그램의 디버깅을 지원하기 위해 Boost.Asio는 핸들러 추적 기능을 지원한다. BOOST_ASIO_ENABLE_HANDLER_TRACKING을 정의하여 기능이 활성화되면, Boost.Asio는 표준 오류 스트림(standard error stream)에 디버깅 출력을 기록한다. 출력은 비동기식 작업과 핸들러 간의 관계를 기록한다. 이 기능은 디버깅할 때, 비동기식 작업이 체인으로 연결된 방식이나 보류 중인(pending) 비동기식 작업이 무엇인지 알아야 하는 경우 유용하다. 다음은 HTTP 서버 예제를 실행하고 단일 요청을 처리한 후 "Ctrl+C"를 통해 종료할 때의 출력이다: @asio|1589424178.741850|0*1|signal_..
사용자 지정 메모리 할당 (Custom Memory Allocation) 많은 비동기 작업은 작업과 관련된 상태를 저장하기 위해 객체를 할당해야 한다. 예를 들어, Win32 구현에서는 Win32 API 함수에 전달하기 위해 OVERLAPPED-파생 객체가 필요하다. 또한, 프로그램에는 일반적으로 쉽게 식별할 수 있는 비동기 작업 체인이 포함되어 있다. 반이중(half duplex) 프로토콜 구현(예: HTTP 서버)에서는 클라이언트당 하나의 작업 체인(수신 후 전송)을 갖는다. 전이중(full duplex) 프로토콜 구현에서는 병렬(parallel)로 실행되는 두 개의 체인을 갖는다. 프로그램은 이 점을 활용하여 체인의 모든 비동기 작업에 대한 메모리를 재사용할 수 있어야 한다. 사용자 정의 Handl..
라인 기반 작업 (Line-Based Operations) 일반적으로 사용되는 많은 인터넷 프로토콜은 라인 기반이며, 이는 문자 시퀀스 "\r\n"로 구분되는 프로토콜 요소를 가지고 있다는 것을 의미한다. 예로 HTTP, SMTP 그리고 FTP 등이 있다. 구분 기호를 사용하는 다른 프로토콜뿐만 아니라 라인 기반 프로토콜의 구현을 보다 쉽게 접근하기 위해서, Boost.Asio는 read_until()와 async_read_until() 함수를 포함하고 있다. 다음 예제는 클라이언트의 HTTP 요청의 첫 번째 라인을 수신하는 위해 HTTP 서버에서 async_read_until()을 사용하는 방법을 보여준다: class http_connection { ... void start() { boost::asi..
Reactor 스타일 작업 (Reactor-Style Operations) 때때로 프로그램은 I/O 작업 자체를 수행하려는 타사 라이브러리와 통합되어야 한다. 이를 용이하게 하기 위해 Boost.Asio는 소켓을 읽기 준비, 쓰기 준비 또는 보류 중인 오류 조건을 대기하는 데 사용할 수 있는 동기식 및 비동기식 작업을 포함하고 있다. 예를 들어, 넌-블럭킹 읽기를 수행하려면 다음과 같이 사용할 수 있다: ip::tcp::socket socket(my_io_context); ... socket.non_blocking(true); ... socket.async_wait(ip::tcp::socket::wait_read, read_handler); ... void read_handler(boost::system..