异步事件循环设计和问题

Art*_*yom 5 c c++ asynchronous nonblocking event-loop

我正在使用epoll/devpoll/kqueue/poll/select(包括windows-select)设计异步套接字IO的事件循环.

我有两个执行IO操作的选项:

非阻止模式,在EAGAIN上进行调查

  1. 将套接字设置为非阻塞模式.
  2. 读/写套接字.
  3. 如果操作成功,则将完成通知发布到事件循环.
  4. 如果我得到EAGAIN,请将套接字添加到"选择列表"并轮询套接字.

轮询模式:轮询然后执行

  1. 添加套接字以选择列表并轮询它.
  2. 等待通知它是可读写的
  3. 读/写
  4. 将完成通知发送到sucseeds的事件循环

对我来说,在普通模式下使用时,首先需要较少的系统调用,特别是对于写入套接字(缓冲区非常大).此外,它似乎可以减少"选择"执行次数的开销,尤其是当你没有像epoll/devpoll/kqueue那样可以扩展的东西时,它会很好.

问题:

  • 第二种方法有什么优点吗?
  • 在许多操作系统上对套接字/文件描述符进行非阻塞操作是否存在任何可移植性问题:Linux,FreeBSD,Solaris,MacOSX,Windows.

注意:请不要建议使用现有的event-loop/socket-api实现

Ioa*_*oan 3

我不确定是否存在跨平台问题;您最多必须使用 Windows Sockets API,但结果相同。

否则,您似乎在这两种情况下都进行轮询(避免阻塞等待),因此两种方法都可以。只要您不将自己置于阻塞的位置(例如,在没有数据时读取,在缓冲区已满时写入),就没有任何区别。

也许第一种方法更容易编码/理解;所以,就这样吧。

您可能有兴趣查看libevc10k 问题的文档,以获取有关此主题的有趣想法/方法。