问题描述
动机:
我正在编写一个应用程序来处理所有可能的通信渠道 以统一的方式,即通过终端、串行接口输入/输出, 图形用户界面 (xcb | win32),通过套接字的 Web 界面。
问题:
我需要一些机制来: a) 使我的主应用程序循环休眠或阻塞(以节省 cpu 时间); b) 一旦数据到达任何通道,就将其再次唤醒。
有什么想法吗? 谢谢。
解决方法
解决方案:
1 个阻塞调用:
- 功能:仅在一个频道上阻止节目
- 问题:无法检测到到达其他通道的数据
- 示例:xcb_wait_for_event、fgetwc
2 个非阻塞调用:
- 功能:无限循环测试/读取所有通道
- 问题:cpu 使用率(忙等待)
- 问题:如果循环比用户快,则不会检测到所有输入
- 示例:xcb_poll_for_event,带有 termios 设置的 fgetwc ~ICANON; ~回声; c_cc[VMIN] = 0; c_cc[VTIME] = 0;
3 选择:
- 功能:避免忙等待,覆盖多频道
- 问题:只处理那些带有文件描述符的通道(不是 xcb 等)
4 libuv(来自 Node.js):
- 功能:处理多通道,事件驱动的异步I/O模型
- 问题:不处理图形窗口系统事件
- 问题:强迫我使用他们的数据结构
- 问题:依赖外部库
每个通道 5 个线程并休眠:
- 功能:确实检测数据并可能设置一个内部标志
- 问题:主循环需要检查flag(忙等待,cpu使用率)
每个通道 6 个线程,暂停或 sigsuspend 和系统信号唤醒:
- 功能:类似于睡眠但避免忙等待使用系统信号唤醒
- 问题:进程的线程也在休眠,无法检测到输入
- 问题:如果我的程序运行多个实例,所有实例都会被唤醒