Windows 最好的 I/O 事件通知工具是什么?

我所说的最好的意思是……

  1. 输入文件描述符的数量没有限制
  2. 适用于所有文件描述符(磁盘文件、套接字...)
  3. 提供多种通知模式(边缘触发、限位触发)
有帮助吗?

解决方案

在Windows中,异步操作是通过文件操作完成的,而不是通过描述符完成的。有多种方法可以异步等待文件操作完成。

例如,如果您想知道网络套接字上的数据何时可用,请在套接字上发出异步读取请求,当请求完成时,数据可用并已被检索。

在 Win32 中,异步操作使用 OVERLAPPED 包含有关未完成 IO 操作的状态的结构。

  1. 将文件与 IO完成端口 并调度异步 IO 请求。当操作完成时,它将在队列中放置一条完成消息,您的工作线程可以等待该消息并在消息到达时检索该消息。您还可以将用户定义的消息放入队列中。完成端口可以使用多少个文​​件或排队消息没有限制
  2. 使用事件调度每个 IO 操作。与操作关联的事件在完成时将发出信号(满足等待)。使用 WaitForMultipleObjects 同时等待所有事件。这样做的缺点是只能等待 MAXIMUM_WAIT_OBJECTS 一次对象 (64)。您还可以同时等待其他类型的事件(进程/线程终止、互斥体、事件、信号量)
  3. 用一个 线程池. 。线程池可以接受无限数量的对象和文件操作来等待和执行 用户定义函数 每个完成后。
  4. 使用 读取文件ExWriteFileEx 排队 异步过程调用 (APC)到调用线程并且 SleepEx (或者 WaitFor{Single|Multiple}ObjectsEx) 和 Alertable TRUE 在每个操作完成时接收通知消息。该方法类似于IO完成端口,但仅适用于一个线程。

Windows NT 内核不区分套接字、磁盘文件、管道等。内部文件操作:所有这些选项都适用于所有文件类型。

其他提示

利布夫

libuv 为 Unix 和 Windows 提供事件 I/O,并支持套接字、文件和管道。它是 Node.js 的平台层。

更多详情请参见: http://nikhilm.github.io/uvbook/introduction.html

据我所知,还没有一个。我和一个朋友正在开发一个开源 Windows epoll 实现(链接如下),但我们在弄清楚如何使其与 Linux 实现的行为相同方面遇到了问题。

目前的障碍:

  • 在 Linux 中,文件描述符和套接字描述符是可以互换的,但在 Windows 中则不然。两者都必须与 epoll 实现兼容。
  • 在 Windows 中,获取内核事件非常棘手......这就是 epoll 在 Linux 中的工作原理。我们猜测使用我们的跨平台 epoll 库的程序在 Windows 中的运行速度将明显慢于 Linux。

随着项目取得进展,我会尝试回来更新这篇文章。

http://sourceforge.net/projects/cpoll

select() 函数是 POSIX 函数,可在 Windows 上使用,包括“winsock.h”或“winsock2.h”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top