发明内容
本发明所要解决的技术问题是,克服上述背景技术的不足,提供一种基于注册回调机制的线程间数据分发方法,数据传输耗时极少,能够应用于线程间数据频繁交互且实时性要求较高的场合。
本发明解决其技术问题采用的技术方案是,一种基于注册回调机制的线程间数据分发方法,包括以下步骤:
(1)数据发布者注册;
(2)数据订阅者注册;
(3)数据发布者发布数据;
其中,步骤(3)中,所述数据发布者发布数据的方法如下:
数据发布者根据数据订阅者的优先级,调用数据订阅者的回调函数接口或数据插入接口;对于优先级最高的数据订阅者,调用其回调函数接口处理数据;对于其他优先级的数据订阅者,调用其数据插入接口,将数据插入到数据订阅者私有数据链表中,唤醒该数据订阅者按顺序取出数据链表中的数据,并调用该数据订阅者的回调函数依次处理数据链表中取出的数据。
进一步,步骤(1)中,所述数据发布者注册的方法如下:
(1-1)线程1向注册中心注册,获得注册中心句柄;
(1-2)在线程1中创建数据发布者,向注册中心提交数据发布者的注册信息;
(1-3)注册中心接收数据发布者的注册请求,将该数据发布者添加到注册中心持有的数据发布者容器中;
(1-4)注册中心将已注册的数据订阅者与数据发布者进行匹配,将所有匹配的数据订阅者添加到数据发布者持有的数据订阅者容器中,并向数据发布者传递所有匹配的数据订阅者的回调函数接口,判断各数据订阅者的优先级,将优先级最高的数据订阅者的回调函数接口绑定至数据发布者。
进一步,步骤(1-2)中,所述数据发布者的注册信息包括主题类型、主题名称以及域。
进一步,步骤(1-4)中,所述数据订阅者与数据发布者匹配的标准为:同一域内,相同主题类型,相同主题名称的数据订阅者与数据发布者相匹配。
进一步,步骤(2)中,所述数据订阅者注册的方法如下:
(2-1)线程2向注册中心注册,获得注册中心句柄;
(2-2)在线程2中创建数据订阅者的回调函数接口;
(2-3)在线程2中创建数据订阅者,向注册中心提交数据订阅者的注册信息;
(2-4)注册中心接收数据订阅者的注册信息,将该数据订阅者添加到注册中心持有的数据订阅者容器中;
(2-5)注册中心将已注册的所有数据发布者与新注册的数据订阅者进行匹配,将新注册的数据订阅者添加到所有匹配的数据发布者持有的数据订阅者容器中,并向所有匹配的数据发布者传递数据订阅者的回调函数接口,判断新注册数据订阅者的优先级,若新注册数据订阅者的优先级高于匹配的数据发布者持有的数据订阅者容器中已有的数据订阅者,将匹配的数据发布者绑定的回调函数接口修改为新注册数据订阅者的回调函数接口。
进一步,步骤(2-3)中,所述数据订阅者的注册信息包括主题类型、主题名称、域、回调函数接口以及数据插入接口。
进一步,步骤(2-5)中,所述数据发布者与数据订阅者匹配的标准为:同一域内相同主题类型,相同主题名称的数据发布者与数据订阅者相匹配。
与现有技术相比,本发明的优点如下:
(1)本发明在机器人中间件本地进程中,提供一个注册中心,记录不同线程中注册的数据发布者和数据订阅订阅者,建立线程间的数据通信通道,使得数据发布者所在线程数据可以在同一时间发布到不同数据订阅者所在线程,简化线程间通信建立过程;数据发布者和数据订阅者多对多存在时,对于优先级最高的数据订阅者,利用注册回调机制,由数据发布者直接调用数据订阅者的回调函数处理数据,数据传输耗时极少,实时响应在10us以内,能够应用于线程间数据频繁交互且实时性要求较高的场合;对于优先级低的数据订阅者,利用发布/订阅通信方式,数据发布者调用数据订阅者的数据插入接口,将数据插入到数据订阅者的数据链表中,实现数据分发功能。
(2)本发明以模块化的方式封装注册中心、数据发布者和数据订阅者,使用过程中可以直接调用提供的注册中心类、数据发布者类和数据订阅者类,快速实现多线程间通信;该方法采用C++标准库实现,支持跨平台使用。
具体实施方式
下面结合附图及具体实施例对本发明作进一步详细描述。
本实施基于注册回调机制的线程间数据分发方法包括线程1:数据发布者所在线程和线程2:数据订阅者所在线程。
本实施基于注册回调机制的线程间数据分发方法包括以下步骤:
101:线程1向注册中心注册,获得注册中心句柄;
102:在线程1中创建数据发布者,向注册中心提交数据发布者的注册信息;数据发布者的注册信息包括主题类型、主题名称以及域;
103:注册中心接收数据发布者的注册请求,将该数据发布者添加到注册中心持有的数据发布者容器中;
104:注册中心将已注册的数据订阅者与数据发布者进行匹配,将所有匹配的数据订阅者添加到数据发布者持有的数据订阅者容器中,并向数据发布者传递所有匹配的数据订阅者的回调函数接口,判断各数据订阅者的优先级,将优先级最高的数据订阅者的回调函数接口绑定至数据发布者;数据订阅者与数据发布者匹配的标准为:同一域内,相同主题类型,相同主题名称的数据订阅者与数据发布者相匹配;主题类型用于标识数据发布者与数据订阅者进行数据交互时传输的数据类型;主题名称用于标识数据发布者与数据订阅者关注的主题;域用于将不同的数据发布者和数据订阅者产生隔离,使不同域中的数据不会产生重叠,避免数据发布者和数据订阅者的数据交互产生混乱,
105:线程2向注册中心注册,获得注册中心句柄;
106:在线程2中创建数据订阅者的回调函数接口;
107:在线程2中创建数据订阅者,向注册中心提交数据订阅者的注册信息;数据订阅者的注册信息包括主题类型、主题名称、域、回调函数接口以及数据插入接口;
108:注册中心接收数据订阅者的注册信息,将该数据订阅者添加到注册中心持有的数据订阅者容器中;
109:注册中心将已注册的所有数据发布者与新注册的数据订阅者进行匹配,将新注册的数据订阅者添加到所有匹配的数据发布者持有的数据订阅者容器中,并向所有匹配的数据发布者传递数据订阅者的回调函数接口,判断新注册数据订阅者的优先级,若新注册数据订阅者的优先级高于匹配的数据发布者持有的数据订阅者容器中已有的数据订阅者,将匹配的数据发布者绑定的回调函数接口修改为新注册数据订阅者的回调函数接口;数据发布者与数据订阅者匹配的标准为:同一域内相同主题类型,相同主题名称的数据发布者与数据订阅者相匹配;
110:线程1的数据发布者发布数据;
111:数据发布者根据数据订阅者的优先级,调用数据订阅者的回调函数接口或数据插入接口;对于优先级最高的数据订阅者,调用其回调函数接口处理数据;对于其他优先级的数据订阅者,调用其数据插入接口,将数据插入到数据订阅者私有数据链表中,唤醒该数据订阅者按顺序取出数据链表中的数据,并调用该数据订阅者的回调函数依次处理数据链表中取出的数据。
本实施基于注册回调机制的线程间数据分发方法包括数据发布者注册、数据订阅者注册和数据分发三部分,参照图1,其中数据发布者注册方法如下:
201:线程1向注册中心注册,获得注册中心句柄;
202:线程1根据主题类型和主题名称创建数据发布者,向注册中心提交数据发布者的注册信息;数据发布者的注册信息包括主题类型、主题名称以及域;
203:注册中心接收数据发布者的注册请求,将该数据发布者添加到注册中心持有的数据发布者容器中;
204:注册中心判断是否有与该数据发布者相匹配的数据订阅者;如果是,执行步骤205,如果否,则执行步骤208;
205:将匹配的数据订阅者添加到数据发布者持有的数据订阅者容器中,并向数据发布者传递匹配的数据订阅者的回调函数接口,
206:判断匹配的数据订阅者的优先级是否大于现有数据订阅者的优先级,如果是,执行步骤207,如果否,则执行步骤208;
207:将优先级最高的数据订阅者的回调函数接口绑定至数据发布者;
208:等待数据发布。
参照图2,其中,数据订阅者注册方法如下:
301:线程2向注册中心注册,获得注册中心句柄;
302:创建数据订阅者的回调函数接口;
303:线程2根据主题类型和主题名称创建数据订阅者,向注册中心提交数据订阅者的注册信息;数据订阅者的注册信息包括主题类型、主题名称、域、回调函数接口以及数据插入接口;
304:注册中心接收数据订阅者的注册信息,将该数据订阅者添加到注册中心持有的数据订阅者容器中;
305:注册中心判断是否有与该数据订阅者相匹配的数据发布者;如果是,执行步骤306,如果否,则执行步骤309;
306:将数据订阅者添加到匹配的数据发布者持有的容器中,并向匹配的数据发布者传递数据订阅者的回调函数接口;
307:判断新注册数据订阅者的优先级是否高于匹配的数据发布者持有容器中已有的数据订阅者,如果是,执行步骤308,如果否,则执行步骤309;
308:将匹配的数据发布者绑定的回调函数接口修改为新注册数据订阅者的回调函数接口;
309:判断该数据订阅者的私有数据链表是否为空,如果是,执行步骤311,如果否,则执行步骤310;
310:按顺序取出数据链表中的数据,并调用回调函数依次处理取出的数据;
311:线程挂起,等待数据发布者唤醒。
参照图3,其中,数据分发方法如下:
401:线程1调用数据发布者的数据发布接口;
402:调用该数据发布者绑定的回调函数接口处理数据;
403:获得该数据发布者的数据订阅者容器;
404:判断是否遍历完数据订阅者容器,如果是,执行步骤408,如果否,则执行步骤405;
405:从数据发布者的数据订阅者容器中获得数据订阅者;
406:判断当前数据订阅者的回调函数接口是否与数据发布者绑定的数据回调接口相同,如果是,执行步骤404,如果否,则执行步骤407;
407:调用当前数据订阅者的数据插入接口,将数据插入到数据订阅者私有数据链表中;
408:唤醒该数据发布者持有数据订阅者容器中的所有数据订阅者;
409:等待下一次数据发布。
本发明插入和取出数据用锁机制。本发明利用注册回调机制,实现数据在线程间快速传输;利用锁机制配合数据链表设计线程间的发布/订阅通信方式,实现数据在多个线程间分发。
本发明在机器人中间件本地进程中,提供一个注册中心,记录不同线程中注册的数据发布者和数据订阅订阅者,建立线程间的数据通信通道,使得数据发布者所在线程数据可以在同一时间发布到不同数据订阅者所在线程,简化线程间通信建立过程;数据发布者和数据订阅者多对多存在时,对于优先级最高的数据订阅者,利用注册回调机制,由数据发布者直接调用数据订阅者的回调函数处理数据,数据传输耗时极少,实时响应在10us以内,能够应用于线程间数据频繁交互且实时性要求较高的场合;对于优先级低的数据订阅者,利用发布/订阅通信方式,数据发布者调用数据订阅者的数据插入接口,将数据插入到数据订阅者的数据链表中,实现数据分发功能。本发明以模块化的方式封装注册中心、数据发布者和数据订阅者,使用过程中可以直接调用提供的注册中心类、数据发布者类和数据订阅者类,快速实现多线程间通信;该方法采用C++标准库实现,支持跨平台使用。
本领域的技术人员可以对本发明进行各种修改和变型,倘若这些修改和变型在本发明权利要求及其等同技术的范围之内,则这些修改和变型也在本发明的保护范围之内。
说明书中未详细描述的内容为本领域技术人员公知的现有技术。