为什么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线程操作于业务的操作。
  • 性能层面:按需线程切换,减少不必要的开销。可以批量处理任务,减少系统调用的次数。
相关推荐
不正经学生1 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
门思科技1 小时前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
M78佐菲4 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
恋恋西风4 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx4 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
不怕犯错,就怕不做4 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
BizzZ_5 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_5 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu5 小时前
CSharp: 万年历
开发语言·后端·c#·.net
weixin_416667965 小时前
【无标题】
运维·服务器·网络