Apollo:源码分析之cyber\blocker\blocker.h

BlockerAttr

cyber\blocker\blocker_test.cc的第一个使用例子:
在这里插入图片描述
首先,BlockAttr说明了Block的一些属性,是用来帮助创建Blocker的。我们来看下它的定义:
在这里插入图片描述
从上面可以看出,它是一个结构体,有两个成员:

  • capacity
  • channel_name

另外还提供了一些构造函数

BlockerBase

在这里插入图片描述
我们看下Blocker的定义:
在这里插入图片描述

Block继承自BlockerBase

在这里插入图片描述
可以看到BlockerBase是一个纯虚的虚函数,定义了很多接口

Blocker

Blocker是Reader中的一个成员,Reader会将自己的数据拷贝一份到Block中

可以将Blocker理解为一个消息的缓存类,同时也记录了该Reader的一些回调函数。

在这里插入图片描述

  • Subscribe/ Unsubscribe注册或者取消回调函数
  • Blocker::Observe()注册监控已经发布[reset之后,调用本函数之前的]的所有消息
  • 当Publish(msg)时会将消息入队并回调所有注册的回调函数

成员变量

数据类型变量名作用
BlockerAttrattr_;
MessageQueueobserved_msg_queue_;
  • MessagePtr = std::shared_ptr<T>
  • MessageQueue = std::list<MessagePtr>;
MessageQueuepublished_msg_queue_;
  • 待发布的消息
mutable std::mutexmsg_mutex_;
CallbackMappublished_callbacks_;
  • Callback = std::function<void(const MessagePtr&)>;
  • std::unordered_map<std::string, Callback>;
mutable std::mutexcb_mutex_;
MessageTypedummy_msg_;
  • MessageType = T
  • 一个标志位,表示监听的消息

重要私有函数

Blocker::Reset()

清空三个函数(确保线程安全)

在这里插入图片描述
可以和析构函数对比着看,在析构函数中就不需要保证线程安全了

在这里插入图片描述

Blocker::Enqueue

在这里插入图片描述

这里就做了一件事情: 将消息入队(并且要确保排队消息不超过最大容量)

在这里插入图片描述

Blocker::Notify

在这里插入图片描述
这里也只做了一件事情:使用msg作为入参并回调所有记录在册的回调函数

重要公有函数

Blocker::Publish(msg)

作用:入队,并调用回调函数

在这里插入图片描述

Blocker::Observe()

在这里插入图片描述
就是将published_msg_queue_直接赋值给observed_msg_queue_

监听所有已经发布的消息

Subscribe/ Unsubscribe

在这里插入图片描述

设置published_callbacks_

这个published_callbacks_在Blocker::Notify时使用,而Blocker::Notify在Blocker::Publish时使用

为什么要有Blocker?

  • (据说:Blocker中的数据时用来仿真的????)
  • blocker是把从Reader那边得到的数据放到自己的message queue中,再提供一个接口给Reader中。
    • 提供一个管理着获取数据的入口,方便debug,记录日志,运行虚拟环境和监控整个系统
    • Blocker里注册的回调函数应该都是管理员注册的监控函数,和系统主逻辑没有关系
  • 主要是帮Reader管理数据相关的逻辑

BlockerManager

在这里插入图片描述
首先,这是一个单例模式

成员变量

数据类型变量名作用
BlockerMapblockers_;
  • using BlockerMap = std::unordered_map<std::string, std::shared_ptr<BlockerBase>>;
  • key=channel_name,value=blocker
std::mutexblocker_mutex_;

重要公有函数

GetOrCreateBlocker

在这里插入图片描述
在这里插入图片描述
从blockers_中查找或者创建一个新的缓存块

GetBlocker

在这里插入图片描述

从blockers_查找channel对应的块,如果找到就返回其共享指针,否则返回NULL

BlockerManager::Publish

在这里插入图片描述

BlockerManager::Subscribe

在这里插入图片描述

怎么用

在这里插入图片描述

小结:

BlockerXXX相关的类实现了这样一个功能:

  • 可以使用public往某个channel发布某个msg(有容量限制)
  • 所有Subscribe这个channel的回调函数会被调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值