为什么moduo库要进行线程检查

问题描述:

在moduo库中调用runloop时会做线程检测

判断当前线程是否为事件循环所属线程,若检测不通过,相关操作不会在当前线程执行,而是会被封装后路由到对应的 IO 线程中执行。

我之前一直疑惑:既然每一个线程都有一个 EventLoop , EventLoop都会有一个poller ,且poller仅负责检测 EventLoop 中注册的 Channel 。那为什么还要进行线程检查呢。

核心原因

其他线程(如业务线程、定时器线程)可能发起对 IO 线程所属 Channel(及关联的 EventLoop/Poller)的修改操作(例如开启 / 关闭 Channel 读写事件、移除 Channel 监听等); 在多个线程中进行修改会导致线程安全等问题,因而强制所有修改/执行IO操作都在IO线程中完成。

例如:

  • 业务线程主动推送消息

​ 需要让 连接的 Channel 增加可写事件

  • 心跳检测关闭不活跃的连接

​ 需要为对应 Channel 禁用所有事件并移除监听。

其他优点:

  • 易用性:业务层不需要考虑调用哪个线程执行操作
  • 保证了 one loop per thread 的稳定性,隔离了 IO线程操作于业务的操作。
    per thread 的稳定性,隔离了 IO线程操作于业务的操作。
  • 性能层面:按需线程切换,减少不必要的开销。可以批量处理任务,减少系统调用的次数。
相关推荐
冉佳驹3 小时前
Linux ——— 静态库和动态库的设计与使用
linux·动态库·静态库·fpic
doupoa3 小时前
内存指针是什么?为什么指针还要有偏移量?
android·c++
小程故事多_803 小时前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
沐知全栈开发3 小时前
SQL 日期处理指南
开发语言
黎雁·泠崖3 小时前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
黎雁·泠崖4 小时前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言
独好紫罗兰4 小时前
对python的再认识-基于数据结构进行-a006-元组-拓展
开发语言·数据结构·python
冉佳驹4 小时前
C++ ——— 异常处理的核心机制和智能指针管理
c++·异常捕获·异常继承体与多态·重载抛异常·raii思想·智能指针shared_ptr·weak_ptr指针
C++ 老炮儿的技术栈4 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
陌上花开缓缓归以4 小时前
linux mtd-utils使用源码分析(ubuntu测试版)
linux·arm开发·ubuntu