为什么异步IO是首选

时间:2016-08-22 02:19:33

标签: c++ sockets winapi asynchronous overlapped-io

所以我一直在做一些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是否值得/需要?

2 个答案:

答案 0 :(得分:4)

你展示的情况并不是使用任何异步I / O的典型原因,正如我所说的那样(因为正如你所指出的那样,反正并不是异步)。

使用异步I / O的典型原因只是因为它是异步的,您的程序可以继续执行其他操作而不是等待I / O操作完成。

答案 1 :(得分:1)

异步I / O保存线程资源。

特别是,无论何时通过同步I / O处理某些客户端请求,都会为其分配1个线程。当你有1个客户时,哪个工作正常。或10个客户。

如果您有10000个客户端,则必须为它们创建10K线程才能为它们提供服务。哪种可能,但在许多情况下效率低下。

使用异步I / O允许在一个线程中处理非常大量的客户端(特定数量取决于OS /体系结构)。通常这种方法可能比少数客户端的专用线程(如请求处理序列化)慢一点,但在其他情况下吞吐量要好得多。