gpt4 book ai didi

c++ - 可以在多线程中使用 WSAEventSelect() 来增加套接字限制吗?

转载 作者:行者123 更新时间:2023-11-30 05:47:17 27 4
gpt4 key购买 nike

article说如下:

The Windows event mechanism (e.g. WaitForMultipleObjects()) can only wait on 64 event objects at a time. Winsock 2 provides the WSAEventSelect() function which lets you use Windows’ event mechanism to wait for events on sockets. Because it uses Windows’ event mechanism, you can only wait for events on 64 sockets at a time. If you want to wait on more than 64 Winsock event objects at a time, you need to use multiple threads, each waiting on no more than 64 of the sockets.

这个说法对吗?我想监视 300 个套接字以查看它们是否有待读取的数据,那么我可以只创建 5 个线程并使用 WSAEventSelect() 来做到这一点吗?

最佳答案

回答您的问题 - 是的,您引用的陈述是正确的。各种 WaitFor 函数一次最多只能等待 64 个对象。因此,要同时等待 300 个套接字事件,您必须等待 5 个线程,其中 4 个线程每个等待 64 个事件,第 5 个线程等待 44 个事件。

如果您想编写可扩展 套接字代码,您根本不应该使用可等待的套接字事件。请改用 I/O 完成端口。您可以将多个套接字与单个 IOCP 句柄相关联,并让多个线程(最好是每个 CPU 核心一个)等待来自该单个 IOCP 的通知。使用启用 IOCP 的套接字函数(WSAConnect()WSAAcept()WSARead()WSASend()等),让他们在工作完成后通知您。这允许您以最小的开销并行处理多个套接字。

有关详细信息,请参阅本文:

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports

关于c++ - 可以在多线程中使用 WSAEventSelect() 来增加套接字限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28628303/

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