异步事件模型的 Self-pipe trick

💡 原文中文,约2100字,阅读约需5分钟。
📝

内容提要

在异步事件模型中,select/poll 循环等待时无法被其他线程唤醒,导致信号和消息处理延迟。为解决此问题,可以使用 self-pipe trick,通过创建匿名管道或 socketpair 实现唤醒机制。使用 notify() 函数避免重复写入管道,确保管道数据清空后处理网络事件和消息队列。主循环设置超时以处理网络和时钟事件。

🎯

关键要点

  • 异步事件模型中,select/poll 循环等待时无法被其他线程唤醒,导致信号和消息处理延迟。

  • 在没有 pselect/ppoll 的系统上,信号无法中断 select/poll 等待,得不到即时处理。

  • 调短 select/poll 的超时时间无效,poll 的超时精度最低为 1ms。

  • self-pipe trick 通过创建匿名管道或 socketpair 实现唤醒机制。

  • 使用 notify() 函数避免重复写入管道,确保管道数据清空后处理网络事件和消息队列。

  • 在非 Windows 系统中使用 pipe() 创建管道,Windows 下使用套接字。

  • 每次 select/poll 醒来时调用 poller_pipe_reset(),确保管道数据被清空。

  • 主循环设置超时以处理网络和时钟事件,确保及时处理消息队列中的新事件。

➡️

继续阅读