ToB企服应用市场:ToB评测及商务社交产业平台

标题: ThreadLoop实践学习笔记 [打印本页]

作者: 去皮卡多    时间: 2024-7-2 22:14
标题: ThreadLoop实践学习笔记
背景

在一样平常工作和学习源码过程中,经常可以看到ThreadLoop的运用,发现ThreadLoop作为一个基础工具,在具体项目中有差异而又十分相似的实现,虽然焦点的机制万变不离其宗(IO多路复用),但面向的业务场景差异导致了差异的实践结果,现在见过有几种ThreadLoop的实践,本文做一个分析记录和知识点的总结
基础TaskLoop:

面向Task:

Task类型包裹回调函数和必要数据,如have_run,is_run,task_tag等,TaskLoop负责实行Task,实质是处理Task类型包裹的回调函数
面向Event:

Event类型和Task相比,拥有了变乱的语义,Event变乱=需要监听的触发源+变乱处理回调,一样平常来说触发源设计为Event Fd可以完善适配IO多路复用机制,同时仅监听Event fd可以给上层组件充足的灵活性,可以认为这是面向变乱ThreadLoop很优雅的设计方法了
  1. 注意:  
  2.     Event类可以设计为基类,事件处理回调OnEventCallback可以通过识别Event的不同类型做事件的分发,完成Event内信息的传递,后续也可以通过基类->子类的转换,实现更多的任务处理和信息传递能力
  3. 讨论1:
  4.     除了poll多路复用+wakeupFd可以用于实现任务/事件队列,相似的也可以使用条件变量的方式做事件的同步,但条件变量有唤醒丢失和虚假唤醒等问题
  5.     相较而言FD的多路复用监听机制更加稳定,同时基于文件描述符监听的方式,可以增加基于Timer FD的功能
  6. 讨论2:
  7.     在具体的实践中,只要能完成实际的业务需求也可以不用解耦,可直接将业务逻辑回调写到secket fd触发后的逻辑中,设计Event来提供监听的统一接口是为了通用性,提供可复用接口给其他模块
复制代码
进阶TaskLoop

MsgQueue:TaskLoop+queue

基于TaskLoop,增加队列queue可实现一个异步的消息队列,提供PostMsg(msg)接口,MsgQueue初始化时绑定消息处理函数init(callback),
Timer:TaskLoop+Timer Fd

基于面向Event的TaskLoop,在Timer的场景下,AddWatch(Event)实质上是AddWatch(TimerEventFd),因此只需要在AddWatch(Event)的基础上做TimerFd创建的封装即可
ThreadLoopMng

线程池,维护多个ThreadLoop的生命周期,派发任务

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4