【发布时间】:2017-06-20 23:26:37
【问题描述】:
所以我一直在研究我正在构建的服务器应用程序的套接字的重叠 IO,并且我不断看到人们说“永远不要使用hEvent”或“IO 完成端口会更快”等等,但没有人说过为什么不使用hEvent,也没有人提供任何关于完成端口更快或更快的真实数据或数字。 hEvent 和 WaitForMultipleObjects() 更适合我的应用程序,所以如果速度差异很小,我倾向于使用它,但如果没有一些真实数据告诉我我有多大的牺牲,我不想承诺正在那里制作。除了一些 StackOverflow 回答说“不要使用这个”而没有给出任何理由之外,我已经搜索和搜索并找不到任何基准或文章或任何比较这两种策略的东西。
谁能在这里提供一些真实的信息或数字,说明使用 hEvent 和完成端口之间的实际区别?
【问题讨论】:
-
这是关于减少线程数的。如果您使用单个
WaitForMultipleObjects来等待您的所有I/O,那么这基本上与I/O 完成端口相同。您不希望每个 I/O 操作都有自己的WaitForSingleObject,因为这意味着每个待处理的 I/O 操作都需要自己的线程,doesn't scale。 -
对,我完全可以理解
WaitForSingleObject绝对不会扩展。我想象WaitForMultipleObjects在这种情况下扮演与epoll类似的角色,尽管我确实意识到存在很大差异。我也可以理解完成端口如何比WaitForMultipleObjects略有优势,但如果优势很小,我更喜欢WaitForMultipleObjects方法,因为它可以更好地(感知)我的应用程序中的线程控制。 -
请记住,使用 WaitForMultipleObjects 会将您限制为每个线程 64 个客户端。您期望同时连接多少个?
-
说“从不使用hEvent”的人需要给出一个理由。否则建议是无用的。
-
@HarryJohnston 真的吗?这就是
MAXIMUM_WAIT_OBJECTS是什么?这是不使用它的一个很好的理由——我实际上还没有开始编写代码,只是查看了文档,并认为MAXIMUM_WAIT_OBJECTS会是......一些合理的东西。谢谢你终于给了一个很好的理由! (而且我只是明确表示我主要不是 Windows 开发人员。:))
标签: c++ windows winsock winsock2