所以我一直在做一些WIN32套接字编程,我试图理解为什么Overlapped IO是首选。特别是,我想知道为什么这样的事情
if (WSARecv(
socket,
dataBuf,
1,
NULL,
&flags,
&ov,
NULL)
== SOCKET_ERROR) {
if (WSAGetLastError() == WSA_IO_PENDING)
{
if (WSAWaitForMultipleEvents(1, &ov.hEvent, FALSE, INFINITE, FALSE) == WAIT_TIMEOUT)
{
return FALSE;
}
} else {
return FALSE;
}
}
// ... more code here
return TRUE;
优先于正常的IO调用
recv(socket, dataBuf, bufLen), 0);
根据我的理解,如果IO事件没有在WSAWaitForMultipleEvents完成,第一个调用将阻塞,而第二个调用直接在recv上阻塞,直到数据到达。那么稍后让IO调用块的实际好处是什么?是 IF 你在等待之前还能做些什么吗?
如果出现这种情况,那么在数据到达之前您无法做任何事情的应用程序中,重叠IO是否值得/需要?
答案 0 :(得分:4)
你展示的情况并不是使用任何异步I / O的典型原因,正如我所说的那样(因为正如你所指出的那样,反正并不是异步)。
使用异步I / O的典型原因只是因为它是异步的,您的程序可以继续执行其他操作而不是等待I / O操作完成。
答案 1 :(得分:1)
异步I / O保存线程资源。
特别是,无论何时通过同步I / O处理某些客户端请求,都会为其分配1个线程。当你有1个客户时,哪个工作正常。或10个客户。
如果您有10000个客户端,则必须为它们创建10K线程才能为它们提供服务。哪种可能,但在许多情况下效率低下。
使用异步I / O允许在一个线程中处理非常大量的客户端(特定数量取决于OS /体系结构)。通常这种方法可能比少数客户端的专用线程(如请求处理序列化)慢一点,但在其他情况下吞吐量要好得多。