如何检测任何通信通道上可用的数据?

问题描述 投票:0回答:1

动机:

我正在编写一个处理所有可能的通信渠道的应用程序 以统一的方式,即通过终端、串行接口输入/输出, 图形用户界面(xcb | win32),通过套接字的 Web 界面。

问题:

我需要一些机制来: a) 让我的主应用程序循环睡眠或阻塞(以节省 CPU 时间); b) 一旦数据到达任何通道就再次唤醒它。

有什么想法吗? 谢谢你。

c multithreading io libuv posix-select
1个回答
1
投票

解决方案:

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 以及系统信号唤醒:

  • 功能:类似睡眠,但避免忙等待,利用系统信号唤醒
  • 问题:进程的线程也在休眠并且无法检测输入
  • 问题:如果运行我的程序的多个实例,所有实例都会被唤醒
© www.soinside.com 2019 - 2024. All rights reserved.