boost_asio学习第2课 2、io_service 探究

接着上篇文章,今天继续探究 io_service。

上篇文章中我们知道了 io_service 是委托给 io_service_impl 实现的。好,废话不多我们来看看这个 io_service_impl 究竟是何方神圣。


namespace detail {

#if defined(BOOST_ASIO_HAS_IOCP)

typedef class win_iocp_io_service io_service_impl;

class win_iocp_overlapped_ptr;

#else

typedef class task_io_service io_service_impl;

#endif

class service_registry;


从命名空间上来看,这是个细节实现的地方。接着向下看,从宏定义中,我们可以很清楚的明白。如果存在 BOOST_ASIO_HAS_IOCP  那 io_service_impl就是 win_iocp_io_service,否则就是 task_io_service。我们先不管  win_iocp_io_service / task_io_service  。接着往下看  class service_registry。

service_registry 是不是很熟悉。这不就是 io_service 构造函数的实现吗?


io_service::io_service() : service_registry_(new boost::asio::detail::service_registry( *this, static_cast(0), (std::numeric_limits::max)())), impl_(service_registry_->first_service()){}


好,让我们定位到 service_registry 里。


template service_registry(boost::asio::io_service& o, Service* initial_service, Arg arg);


service_registry 的构造函数需要 3 个参数。结合 io_service 的构造函数一起来看

*this,这个是io_service对象本身,作为所有服务的owner存在。

static_cast(0),一个空指针对象,主要是为了模版参数类型推导。在service_registry的构造过程中,也会自动创建一个该类型的对象,作为第一个service对象。

(std::numeric_limits::max)():提供一个最大的整数作为service构造时的参数——目前还没看到这个参数的用途。

service_registry 的构造函数

template< typename Service, typename Arg >

service_registry::service_registry(

boost::asio::io_service& o, Service*, Arg arg)

: owner_(o),

first_service_(new Service(o, arg)) {

boost::asio::io_service::service::key key;

init_key(key, Service::id);

first_service_->key_ = key;

first_service_->next_ = 0;

}

这个service_registry 是干什么的?我以后在的文章里是会详细讨论的。现在只要知道他是一个列表就好了。

你可能感兴趣的:(boost_asio学习第2课 2、io_service 探究)