asio之服务的理解

2024-09-01 01:12
文章标签 服务 理解 asio

本文主要是介绍asio之服务的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务组件

asio中的服务抽象为io_service::service

io_service::service
- boost::asio::io_service& owner_
- service* next_
- key key_
+boost::asio::io_service& get_io_service()
#~service()
#service(boost::asio::io_service& owner)
-void shutdown_service()
-void fork_service(boost::asio::io_service::fork_event event)

shutdown_service为虚方法
next_表示下一个服务,主要用于服务的管理,通过将所有的服务连接起来构成一个链表
key的定义为

  struct key{key() : type_info_(0), id_(0) {}const std::type_info* type_info_;const boost::asio::io_service::id* id_;} key_;

key用于区分服务,有两种使用方式,一种是使用service::id,一种是使用type_info

#if !defined(BOOST_ASIO_NO_TYPEID)
template <typename Service>
void service_registry::init_key(boost::asio::io_service::service::key& key,const boost::asio::detail::service_id<Service>& /*id*/)
{key.type_info_ = &typeid(typeid_wrapper<Service>);key.id_ = 0;
}
#endif // !defined(BOOST_ASIO_NO_TYPEID)void service_registry::init_key(boost::asio::io_service::service::key& key,const boost::asio::io_service::id& id)
{key.type_info_ = 0;key.id_ = &id;
}

服务标识

通过id来区分不同的服务

io_service::id
+id()

通过类模板来区分不同的服务类型

service_id<Type>
io_service::id

带有标识的服务

通过类模板service_base来表示带有标识的服务,包含静态类型service_id的成员

service_base<Type>
+ static boost::asio::detail::service_id<Type> id
io_service::service

服务管理

service_registry用于注册管理服务

service_registry
- boost::asio::detail::mutex mutex_
- boost::asio::io_service& owner_
- boost::asio::io_service::service* first_service_
+template ~typename Service, typename Arg~ service_registry(boost::asio::io_service& o, Service* initial_service, Arg arg)
+void notify_fork(boost::asio::io_service::fork_event fork_ev)
+template ~typename Service~ Service& first_service()
+template ~typename Service~ Service& use_service()
+template ~typename Service~ void add_service(Service* new_service)
+template ~typename Service~ bool has_service()
-static void init_key(boost::asio::io_service::service::key& key,const boost::asio::io_service::id& id)
-static bool keys_match(const boost::asio::io_service::service::key& key1,const boost::asio::io_service::service::key& key2)
-template ~typename Service~ static boost::asio::io_service::service* create(boost::asio::io_service& owner)
-static void destroy(boost::asio::io_service::service* service)
-boost::asio::io_service::service* do_use_service(const boost::asio::io_service::service::key& key,factory_type factory)
-void do_add_service(const boost::asio::io_service::service::key& key,boost::asio::io_service::service* new_service)
-bool do_has_service(const boost::asio::io_service::service::key& key)

first_service():返回服务链表中的第一个服务
use_service():如果链表中有对应的服务则直接使用,没有就添加到链表中
add_service(Service* new_service):链表中有则抛出异常,否则添加到链表中
has_service():链表中是否有服务

服务相关函数模板

template <typename Service> Service& use_service(io_service& ios);
template <typename Service> void add_service(io_service& ios, Service* svc);
template <typename Service> bool has_service(io_service& ios);

这篇关于asio之服务的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125527

相关文章

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依