C语言实现发布者订阅者模型

使用 C 语言实现发布者-订阅者(Publish-Subscribe,简称 Pub/Sub)模型,是通过函数指针、事件管理结构、数组或链表等基本机制,模拟一种“消息驱动、解耦通信”的机制。下面从概念、核心结构、实现流程和代码示例四个部分进行详细讲解。

一、概念

发布者-订阅者模型是一种消息传递模式,其中:

  • 发布者(Publisher):只负责发布消息,不知道消息会被谁接收。
  • 订阅者(Subscriber):注册对某类消息的兴趣,一旦消息发布,就会接收到通知。
  • 事件管理器:维护事件和订阅者之间的关系,是中介。

这种模式具有较强的解耦性:发布者和订阅者之间不直接通信。

二、核心结构设计

为了实现 Pub/Sub 模型,需要以下结构:

1. 回调函数类型定义

typedef void (*Callback)(const char* message);

每个订阅者提供一个函数指针,作为回调函数接收消息。

2. 事件结构体

#define MAX_SUBSCRIBERS 10

typedef struct {
    const char* event_name;
    Callback subscribers[MAX_SUBSCRIBERS];
    int subscriber_count;
} Event;

用于记录一个事件名及其对应的所有订阅者函数。

3. 全局事件列表

#define MAX_EVENTS 10
static Event event_list[MAX_EVENTS];
static int event_count = 0;

用于维护所有事件及其订阅者。

三、实现流程

1. subscribe(event_name, callback):订阅事件

  • 遍历已有事件,查找匹配的事件名。
  • 如果找到,就将回调函数加入其订阅者列表。
  • 如果未找到,创建一个新的事件并添加订阅者。

2. publish(event_name, message):发布事件

  • 查找指定事件名。
  • 遍历其所有订阅者,依次调用每个回调函数,传入消息。

四、完整示例代码

#include <stdio.h>
#include <string.h>

#define MAX_EVENTS 10
#define MAX_SUBSCRIBERS 10

typedef void (*Callback)(const char* message);

typedef struct {
    const char* 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

不知道,大家有没有遇到传销组织的工作,在我工作初期几年前,差一点误入歧路进去一场传销组织。那年2010年刚刚步入职场,在一家广州公司干了大约一年了,自己褪去了初入职场的不安和恐怯。技术和自己的职场交际也得到了大的提升。人呢不能吃的太饱,吃的太饱就会瞎弄,这是不知道出于炫耀的心里就聊到一个高中读书时候的妹子。然后就开始长达半年的聊天产生一点情愫。女孩子和我一样在高中平平无奇,在高中时候有过几次的交流,其余都是以学业为重,三年之后就是认识自己几个同学,其余同学就是过往的人。这时妹子突然说&amp;quot;要不然来我的城市,一起来打拼,我这里有不错的选择&amp;quot;。我答应下来了,我立马就辞职,踏上去她的城市里-郑州。我一路坐上绿皮车摇摇晃晃到了郑州,经过了26小时。我到站了,我打电话给她,她然后约到站口相遇,但是相遇时候,我感觉那个熟悉的女孩还是高中时代女孩,不够漂亮,但是有点农村逆袭聪明的女人。看上去穿着比较鲜艳但是和她皮肤有不太合适的感觉。一顿子寒暄之后,拉走我的行李箱,我们一起去她生活的地方,路上聊了很多,看她也没有啥变化,还是原来的样子。到了一个地方下站,她突然说:&amp;quot;天色还早,我们走一走,顺便等下我的朋友&amp;quot;,我就很奇怪,咋不先让我放下箱子一起逛么?她说刚好她的一个朋友也来接她,我当时还以为是她的室友之类的。过几十分钟之后,她的朋友也来了,是个女性,当时不太记得容貌了,我心理就感觉很奇怪,三个人一起在街上晃荡,还拖着行李箱。终于到一个小区里面,爬上了大约4楼的样子,在爬楼的时候叫我小心点不要太用力,要不然吵到邻居。她们一打开门之后,引入满眼的是一群人的热烈欢迎。我当时脑子懵了,我是谁,我在干嘛,我在哪里。这时有的帮我拿行李,有的拿来一盆水说来给我洗脚??我这辈子还没遇到去别人争先恐后的给我洗脚。小时候我妈给我洗过脚之后,这是生平第一次别人给我洗脚,而且是那么多双手。我还没反应过来,也不知道有多少人,反正那个场景我没法理智来认清任何人。我在寻找我的女友,她在我身边,大家叽叽喳喳的。洗完脚之后,我急忙拉倒一个阳台我和她说:&amp;quot;你这是传销吗?&amp;quot;。她说不是,这是他们的一个商业模式,你想不想发财,我们这个三年就能做到一百万。我面对这方言论,怎么跟我那个QQ聊天的不一样呢?我也试图解释到这就是传销,和电视上演的一样。她说&amp;quot;不是,如果是就会限制你的自由,但是我们这里你随时都可以走,你要是觉得不赚钱,你就随时可以走&amp;quot;。我意识到我试图让她立马和我离开是不可能的。我必须先自己离开这个地方。这是一个叫&amp;quot;王哥&amp;quot;的男人过来,女朋友轻声叫了一声&amp;quot;王总&amp;quot;,一看干瘦,穿着一套素西装,不是那么正式。&amp;quot;怎么样,小胡,你男朋友愿不愿和我们干一番大事业&amp;quot;。女朋友介绍起来,&amp;quot;这是王哥,平时我们工作关系叫王总。王总,这是我男朋友,之前在广州,今天特地来投奔我来的&amp;quot;。我表示友好:&amp;quot;我先考虑考虑一下,我还是来这里我找找我对口的工作&amp;quot;。&amp;quot;小胡(我女朋友),你都和他说了吧&amp;quot;,女朋友点点头。&amp;quot;好吧先别说那么多,我们先吃饭,今天那个张总(其他传销分子)带了家乡特产,我们大家一起吃个饭&amp;quot;。他们这里资历稍微老一点都叫总,身上凑不出20块钱喊出200w的感觉。我走到厨房一看他们所说的特产,就是一包盐菜,而且就一个菜,看上去是非常难吃,跟家里的猪食差不多的感觉。我又走到其他一个大房间看了看,一间大通铺,里面有七八床被子,也没有分男女,我看完之后这鬼地方,我决心要离开,但是我贸然说不太好,估计会把我抓着禁闭,而且我的行李还在他们这里。吃饭时间到了,大约下午5点左右,做菜毕竟一道菜,时间也很快。在其他一个叫学习室的房间里,大约十人左右围着一个地板,没有桌子,围着一个长方椭圆形,大家正襟危坐。&amp;quot;王哥&amp;quot;坐在头部,大伙两边坐,然后大家把饭打好,菜和饭搅拌在一起。每人前面都一碗饭,我也不例外。我早上在车上吃了,中午还没吃饭,我迫不及待的准备拿起准备吃,被女朋友制止了说,待会王哥会发言。随后一个挨着王哥的小罗罗喊到,&amp;quot;欢迎王总发言&amp;quot;。大家都鼓掌起来,我也鼓掌起来,我似乎融入其中了。王哥心满意足的挥了挥手让大家安静下来,大伙突然安静下来,像军队一样的纪律。王哥说:大家以后都是公司重要的人才,我们先苦后甜,现在我们吃的苦中苦,方为人上人。也欢迎我们新的成员小伟的到来,希望大家再接再厉,把我们团队发展壮大。大家又鼓掌起来,这种话大家听的好认真,比在学校里听课还认真,似乎这些知识听进去就能发财一样。&amp;quot;好,大家开始用餐吧&amp;quot;。这个词用的特别正经,我都不太习惯,大伙才开始干饭了,还没吃就已经有人在那里赞美这个做的非常好吃,说张总带的特产菜非常不错。我塞一口饭,极其难吃,没油,烧焦干巴巴的。我吃了两口,就不吃。要不是饿了,我估计第一口饭都不吃。王总还在给大家普及教育相关赞美的理论,就是大家也不要忘记做饭的人,要不要吝啬自己的赞美之词。周边的人纷纷效仿,无中生有赞美起来。我吃了几口放下了,实在吃不下去,女朋友说你吃饱了么,我们还是不要浪费粮食了吧。我说我有点累吃不下饭。女朋友说那我帮你吃吧,端起我那碗饭吃了起来。
牛友故事会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务