Boost.ASIO源码:service_registry::use_service()详解以及相关type_traits解析

Boost.ASIO源码:service_registry::use_service详解以及相关type_traits解析这都是神仙写的代码吧use_service()的功能与内部逻辑init_key()详解enable_if和is_base_of中的细节这都是神仙写的代码吧没什么,这个标题只是忍不住表达一下对ASIO的惊叹。曾经看《STL源码剖析》对里面的type_traits的设计惊为天...
摘要由CSDN通过智能技术生成

这都是神仙写的代码吧

没什么,这个标题只是忍不住表达一下对ASIO的惊叹。
曾经看《STL源码剖析》对里面的type_traits的设计惊为天人,没想到看ASIO库的时候又看到了同样的设计模式,虽然对于C++功底还不深的我来说看起来十分的费劲,但我还是决定好好的自己理解一遍,并把它记录下来。由于不喜欢黑盒法,所以几乎每个函数我都会跳进去瞅瞅,所以虽然use_service逻辑不复杂,但这里介绍依旧会很细。

use_service()的功能与内部逻辑

首先,解释一下,use_service存在于execution_context.hpp中,是一个全局模板函数,用于得到一个指定type的Service对象。以下为函数声明:

template <typename Service> Service& use_service(execution_context&);
template <typename Service> Service& use_service(io_context&);

Service是ASIO中的一种概念,如scheduler和epoll_reactor都是Service,其实Service具体是啥我也没有理解得特别深 ,但它们都有一个明显的共同点,就是都继承自execution_context::service

下面回到use_service函数上来,这里以一个use_service的使用情况来开始说明。

// scheduler类的一个成员函数
void scheduler::init_task()
{
   
  mutex::scoped_lock lock(mutex_);
  if (!shutdown_ && !task_)
  {
   

    task_ = &use_service<reactor>(this->context());  //关注这一行就行了
    /* typedef class epoll_reactor reactor; */  // 这是在一个遥远的山卡拉角落对于reactor的定义
    
    op_queue_.push(&task_operation_);
    wake_one_thread_and_unlock(lock);
  }
}

先说明作用,那一句能得到一个reactor实例并赋给task_,这个reactor就是epoll_reactor类,它也是个execution_context::service的子类。
进入这个use_service函数内部:

template <typename Service>
inline Service& use_service(execution_context& e)
{
   
  // Check that Service meets the necessary type requirements.
  (void)static_cast<execution_context::service*>(static_cast<Service*>(0));

  return e.service_registry_->template use_service<Service>();
}

对于中间

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值