제안된 표준 Executors (Proposed Standard Executors)
Boost.Asio는 P0443r13, P1348r0 그리고 P1393r0에 설명된 제안된 표준 실행기(executor)의 완전한 구현을 제공한다.
Networking TS 모델의 실행기(executor)와 마찬가지로, 표준 실행기(executor)는 코드의 조각이 실행되는 방법, 시기 그리고 위치에 대한 정책을 나타낸다. 대부분의 기존 코드는 거의 또는 변경 없이 계속 작동해야 한다.
Boost.Asio의 표준 실행기(Executor) 구현
io_context::executor_type, thread_pool::executor_type, system_executor 그리고 strand 실행기(executor)는 제안된 표준 실행기(executor)에 대한 요구 사항을 충족한다. 호환성을 위해, 이러한 클래스는 또한 Networking TS의 실행기(executor)에 대한 요구 사항도 충족한다.
Boost.Asio에서 표준 실행기(Executor) 사용
ip::tcp::socket, 비동기 작업과 같은 모든 I/O 객체 그리고 dispatch, post, defer, get_associated_executor, bind_executor, make_work_guard, spawn, co_spawn, async_compose, use_future 등을 포함한 유틸리티는 제안된 표준 실행기(executor) 및 Networking TS 실행기(executor)와 함께 상호 운용될 수 있다. Boost.Asio의 구현은 컴파일 시간에 특정 실행기(executor)가 만나게 되는 모델로 결정한다. 두 모델이 모두 감지되면, 제안된 표준 실행기(executor) 모델이 우선적으로 사용된다.
BOOST_ASIO_NO_TS_EXECUTORS를 정의하여 기존 실행기(executor)의 Networking TS 모델에 대한 지원을 사용하지 않도록 설정할 수 있다.
다양한 I/O 실행기(Executor)
any_io_executor 유형 별칭은 모든 I/O 객체에 대한 기본 런타임 다형성 실행기(executor)이다. 이 유형의 별칭은 I/O와 함께 사용하도록 지정된 지원 가능한 속성의 집합을 포함하는 execution::any_executor<> 템플릿을 지정한다.
이 새로운 이름은 이전 다형성 래퍼인 executor를 직접 사용하는 기존 코드를 손상시킬 수 있다. 이전 버전과 호환성이 필요한 경우, BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT를 정의하여 any_io_executor 유형 별칭이 대신 실행기(executor) 다형성 래퍼를 지정하도록 변경할 수 있다.
최소 I/O 실행기(Executor) 구현
표준 실행기(executor) 속성은 실행기(executor)에 대한 이전에 어려운 요구 사항(작업 카운팅 또는 post, dispatch 그리고 defer 사이를 구분하는 기능 등과 같은)들을 선택적 기능으로 만든다. 이러한 완화를 통해 I/O 실행기(executor)에 대한 최소 요구 사항은 다음과 같다:
- 실행기(executor)의 개념을 준수한다.
- execution::context 속성을 쿼리 하는 기능으로, 결과는 execution_context&이거나 execution_context에서 파생된 클래스에 대한 참조이다.
- 최소한 execution::blocking.never 의미 체계를 갖는 실행 작업이다.
다음 예제는 최소 I/O 실행기(executor)를 보여준다. 다른 곳에서 구현된 큐 제출 작업이 주어지면:
queue_t queue_create();
template <typename F> void queue_submit(queue_t q, F f);
실행기(executor)는 다음과 같이 정의할 수 있다:
struct minimal_io_executor
{
boost::asio::execution_context* context_;
queue_t queue_;
bool operator==(const minimal_io_executor& other) const noexcept
{
return context_ == other.context_ && queue_ == other.queue_;
}
bool operator!=(const minimal_io_executor& other) const noexcept
{
return !(*this == other);
}
boost::asio::execution_context& query(
boost::asio::execution::context_t) const noexcept
{
return *context_;
}
static constexpr boost::asio::execution::blocking_t::never_t query(
boost::asio::execution::blocking_t) noexcept
{
// This executor always has blocking.never semantics.
return boost::asio::execution::blocking.never;
}
template <class F>
void execute(F f) const
{
queue_submit(queue_, std::move(f));
}
};
이 실행기(executor)는 다음과 같이 생성될 수 있다:
boost::asio::execution_context context;
queue_t queue = queue_create();
minimal_io_executor executor{&context, queue};
그리고 I/O 개체와 함께 사용된다:
boost::asio::ip::tcp::acceptor acceptor(executor);
또는 any_io_executor 다형성 래퍼에 할당된다:
boost::asio::any_io_executor poly_executor = executor;
실행자(Executor) 개념의 적합성 추론에 대한 특성
이전 C++ 표준 및 컴파일러는 실행기(executor) 구현이 실행기(executor) 개념 및 유형 요구 사항을 준수하는지 결정하기 위해 약간의 도움이 필요하다. 이것은 특성의 전문화를 통해 달성된다. 다음 코드는 위의 minimal_io_executor 예제에 대한 이런 특성의 전문화를 보여준다:
namespace boost { namespace asio {
namespace traits {
#if !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
template <typename F>
struct execute_member<minimal_io_executor, F>
{
static constexpr bool is_valid = true;
static constexpr bool is_noexcept = true;
typedef void result_type;
};
#endif // !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
#if !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
template <>
struct equality_comparable<minimal_io_executor>
{
static constexpr bool is_valid = true;
static constexpr bool is_noexcept = true;
};
#endif // !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
#if !defined(BOOST_ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
template <>
struct query_member<minimal_io_executor,
boost::asio::execution::context_t>
{
static constexpr bool is_valid = true;
static constexpr bool is_noexcept = true;
typedef boost::asio::execution_context& result_type;
};
#endif // !defined(BOOST_ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
#if !defined(BOOST_ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
template <typename Property>
struct query_static_constexpr_member<minimal_io_executor, Property,
typename enable_if<
std::is_convertible<Property, boost::asio::execution::blocking_t>::value
>::type>
{
static constexpr bool is_valid = true;
static constexpr bool is_noexcept = true;
typedef boost::asio::execution::blocking_t::never_t result_type;
static constexpr result_type value() noexcept { return result_type(); }
};
#endif // !defined(BOOST_ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
} // namespace traits
} } // namespace boost::asio
Boost.Asio는 광범위한 특성 세트를 사용하여 이전 C++ 표준에서 제안된 표준 실행기(executor)의 모든 기능을 구현한다. 이런 특성은 boost/asio/traits include 디렉터리에서 찾을 수 있다.
원본 링크
'Boost C++ Libraries > Boost.Asio' 카테고리의 다른 글
Boost.Asio 색인 (0) | 2020.12.22 |
---|---|
Boost.Asio 수정 내역 (Asio 1.18.0 이후 버전만 적용) (0) | 2020.12.21 |
Boost.Asio "C++ Extensions for Networking" TS 호환성 (0) | 2020.12.20 |
Boost.Asio 참조 - 윈도우-기반 (0) | 2020.12.20 |
Boost.Asio 참조 - POSIX-기반 (0) | 2020.12.20 |