사용자 지정 메모리 할당 (Custom Memory Allocation)
많은 비동기 작업은 작업과 관련된 상태를 저장하기 위해 객체를 할당해야 한다. 예를 들어, Win32 구현에서는 Win32 API 함수에 전달하기 위해 OVERLAPPED-파생 객체가 필요하다.
또한, 프로그램에는 일반적으로 쉽게 식별할 수 있는 비동기 작업 체인이 포함되어 있다. 반이중(half duplex) 프로토콜 구현(예: HTTP 서버)에서는 클라이언트당 하나의 작업 체인(수신 후 전송)을 갖는다. 전이중(full duplex) 프로토콜 구현에서는 병렬(parallel)로 실행되는 두 개의 체인을 갖는다. 프로그램은 이 점을 활용하여 체인의 모든 비동기 작업에 대한 메모리를 재사용할 수 있어야 한다.
사용자 정의 Handler 개체 h의 복사본이 주어지면, 구현에서 해당 핸들러와 관련된 메모리를 할당해야 할 경우 get_associated_allocator 함수를 사용하여 할당자(allocator)를 얻는다. 예를 들면 다음과 같다:
boost::asio::associated_allocator_t<Handler> a = boost::asio::get_associated_allocator(h);
관련 할당자(allocator)는 "Standard Allocator" 요구 사항을 충족해야 한다.
기본적으로 핸들러는 표준 할당자(::operator new()와 ::operator delete() 측면에서 구현됨)를 사용한다. 할당자는 중첩 유형 allocator_type와 멤버 함수 get_allocator()를 지정하여 특정 핸들러 유형에 맞게 사용자 정의할 수 있다:
class my_handler { public: // Custom implementation of Allocator type requirements. typedef my_allocator allocator_type; // Return a custom allocator implementation. allocator_type get_allocator() const noexcept { return my_allocator(); } void operator()() { ... } };
더 복잡한 경우, associated_allocator 템플릿이 다음과 같이 직접 특수화될 수 있다:
namespace boost { namespace asio { template <typename Allocator> struct associated_allocator<my_handler, Allocator> { // Custom implementation of Allocator type requirements. typedef my_allocator type; // Return a custom allocator implementation. static type get(const my_handler&, const Allocator& a = Allocator()) noexcept { return my_allocator(); } }; } } // namespace boost::asio
구현은 관련 핸들러가 호출되기 전에 할당 해제가 발생하도록 보장한다. 즉 핸들러에 의해 시작된 새로운 비동기 작업에 메모리를 재사용할 준비가 되어 있음을 의미한다.
사용자 정의 메모리 할당 함수는 라이브러리 함수를 호출하는 사용자 생성 스레드에서 호출할 수 있다. 라이브러리를 포함하는 비동기 작업의 구현은 해당 핸들러에 대한 메모리 할당 함수를 동시에 호출하지 않도록 보장한다. 다른 스레드에서 할당 함수를 호출하는 경우의 구현은 정확한 메모리 가시성을 보장하기 위해 적절한 메모리 경계를 정할 것이다.
더 보기
associated_allocator, get_associated_allocator, custom memory allocation example (C++03), custom memory allocation example (C++11).
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 개요 - 핵심 개념 및 기능 - 동시성 힌트 (0) | 2020.12.09 |
---|---|
Boost.Asio 개요 - 핵심 개념 및 기능 - 핸들러 추적 (0) | 2020.12.09 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 라인 기반 작업 (0) | 2020.12.08 |
Boost.Asio 개요 - 핵심 개념 및 기능 - Reactor 스타일 작업 (0) | 2020.12.08 |
Boost.Asio 개요 - 핵심 개념 및 기능 - 스트림, 짧은 읽기와 짧은 쓰기 (0) | 2020.12.08 |