gpt4 book ai didi

winapi - Win32 重叠 I/O - 完成例程还是 WaitForMultipleObjects?

转载 作者:行者123 更新时间:2023-12-01 22:53:27 32 4
gpt4 key购买 nike

我想知道哪种方法更快,为什么?

在编写 Win32 服务器时,我阅读了很多有关完成端口和重叠 I/O 的内容,但我没有阅读任何内容来建议哪组 API 在服务器中产生最佳结果。

我应该使用完成例程,还是应该使用 WaitForMultipleObjects API?为什么?

最佳答案

您建议了两种执行重叠 I/O 的方法并忽略第三种方法(或者我误解了您的问题)。

当您发出重叠操作时,WSARecv()例如,您可以指定一个包含事件的 OVERLAPPED 结构,并且您可以等待该事件发出信号以指示重叠 I/O 已完成。我认为,这是您的 WaitForMultipleObjects() 方法,并且如前所述,这不能很好地扩展,因为您受限于可以传递给 WaitForMultipleObjects() 的句柄数量。

或者,您可以传递一个完成例程,该例程在完成发生时调用。这称为“可警报 I/O”,并要求发出 WSARecv() 调用的线程处于“可警报”状态才能调用完成例程。线程可以通过多种方式将自己置于可警报状态(调用 SleepEx() 或 Wait 函数的各种 EX 版本等)。 Richter book我在我面前打开的文档说“我已经使用了很多可警报 I/O,我将是第一个告诉您可警报 I/O 很糟糕并且应该避免的人”。恕我直言,够了。

还有第三种方法,在发出调用之前,您应该将要执行重叠 I/O 的句柄与完成端口关联起来。然后,您可以通过调用 GetQueuedCompletionStatus() 和循环来创建一个为该完成端口提供服务的线程池。您使用 OVERLAPPED 结构发出 WSARecv(),其中没有事件,当 I/O 完成时,完成会从 I/O 池线程之一上的 GetQueuedCompletionStatus() 弹出,并可以在那里进行处理。

如前所述,Vista/Server 2008 稍微清理了 IOCP 的工作方式,并消除了您必须确保发出重叠请求的线程继续运行直到请求完成为止的问题。可以找到该引用的链接 here 。但无论如何,这个问题很容易解决;您只需使用用于完成的相同 IOCP 将 WSARecv 编码到您的 I/O 池线程之一...

无论如何,恕我直言,使用 IOCP 是执行重叠 I/O 的最佳方法。是的,一开始就了解调用的重叠/异步性质可能需要一些时间,但这是非常值得的,因为系统可扩展性非常好,并提供了一种简单的“即发即忘”方法来处理重叠操作。

如果您需要一些示例代码来帮助您入门,那么我有几篇关于编写 IO 完成端口系统的文章和一堆免费代码,它们为高性能服务器提供了现实世界的框架;请参阅here

顺便说一句;恕我直言,您确实应该阅读 Jeffrey Richter 和 Christophe Nasarre 撰写的“Windows Via C/C++ (PRO-Developer)”,因为它涵盖了您需要了解的有关重叠 I/O 以及大多数其他高级 Windows 平台技术和 API 的所有信息。

关于winapi - Win32 重叠 I/O - 完成例程还是 WaitForMultipleObjects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/754068/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com