是否可以在 Reactor 样式的操作中使用 IOCP(或其他 API)?
Posted
技术标签:
【中文标题】是否可以在 Reactor 样式的操作中使用 IOCP(或其他 API)?【英文标题】:Is is possible to use IOCP (or other API) in Reactor-style operations? 【发布时间】:2010-03-27 19:27:21 【问题描述】:是否有任何可扩展的 Win32 API(如 IOCP 而不是 select)为您提供反应器风格 套接字上的操作? AFAIK IOCP 允许您接收已完成操作的通知 喜欢读取或写入的数据(前摄器),但我正在寻找反应堆风格的操作:我 当套接字可读或可写(反应器)时需要得到通知。
类似epoll、kqueue、/dev/poll
的东西?
Win32 中有这样的 API 吗?如果是这样,我在哪里可以找到它的手册?
** 澄清:** 我需要select
之类的 api 用于与 IOCP 一样可扩展的套接字,或者我正在寻找一种在类似反应器的操作中使用 IOCP 的方法。
更多说明: IOCP 允许您在给定操作完成时收到通知。例如:
WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done
所以我在操作完成后收到通知 -- 监考式操作。
我需要的是这样的:
WSARecv( NOTHING ); // start waiting for readability (not actual read)
WSAWaitForMultipleEvents(...); // wait until read would not block
// Now WSARecv would not block
WSARecv(buffer,...); // now actual non-blocking read
我该怎么做?
【问题讨论】:
为什么你觉得你需要以'reactor'风格设计你的代码?为什么不能简单地使用 IOCP ?它运行良好,模型很容易理解,只要您花一点时间了解它。 我想创建一个 tiny 跨平台 select-likeC
库,它将在 Linux 上使用 epoll,在 FreeBSD 上使用 kqueue,在 Solaris 和 HP-UX 上使用 /dev/poll
, IOCP 在 Windows 上,在通用 UNIX 上轮询并在所有其他上选择。除了 IOCP 之外,所有这些 API 都是反应器风格的 API,所以我更喜欢坚持使用它们。另一个问题是操作取消在前摄器风格的 API 中更复杂,并且在 XP 和更低版本的 IOCP 下非常有问题。 (是的,我熟悉 ASIO、Libevent 和其他人......所以不要建议他们)
接受这一点,因为它是跨平台的并且您正在做出妥协,它永远不会像它可能的那样高性能,只需在 Windows 上使用 select 并在必要时使用额外的线程来处理句柄限制...
s/clearification/clarification/g 请。
【参考方案1】:
您想查看WSAAsyncSelect API。它使用 Windows 消息队列来表示已读取句柄以进行读/写/任何操作,因此它没有 IOCP 的并发优势,但它允许您实现标准反应器模式,而对数量没有限制句柄(如WSAWaitForMultipleEvents
)。
【讨论】:
看起来 WSAAsyncSelect 确实是您想要的。你能解释一下为什么不是吗?【参考方案2】:我很困惑,线程阻塞等待多个事件源的反应堆模式不是吗?那将是 Windows 支持的 select()。 Proactor 模式是每次调用都有一个回调,您可以通过 ReadFileEx/WriteFileEx 完成。
【讨论】:
是的,select like 操作是我需要的,但 select 的可扩展性不如 epoll/kqueue。 我认为 WaitForMultipleObjectsEx 会为您做与 select 相同的事情,但不确定它是否会解决您的性能问题。【参考方案3】:不可能。
我检查了 Boost.Asio 源,它们确实具有反应器式操作并使用 IOCP。对于所有反应器样式的操作,使用 select
的单独线程代替 IOCP。
【讨论】:
【参考方案4】:您是否尝试将零 nNumberOfBytesToRead 传递给例如 ReadFile(socket_fd, ..)?
也许这将有助于获得“read ready”事件。
【讨论】:
以上是关于是否可以在 Reactor 样式的操作中使用 IOCP(或其他 API)?的主要内容,如果未能解决你的问题,请参考以下文章