这都是神仙写的代码吧
没什么,这个标题只是忍不住表达一下对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>();
}
对于中间