为什么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线程操作于业务的操作。
  • 性能层面:按需线程切换,减少不必要的开销。可以批量处理任务,减少系统调用的次数。
相关推荐
肆忆_12 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
chlk12314 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑15 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件15 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
不想写代码的星星15 小时前
虚函数表:C++ 多态背后的那个男人
c++
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
端平入洛2 天前
delete又未完全delete
c++