非阻塞套接字的紧密recv循环

时间:2017-04-15 17:51:12

标签: c++ sockets loops

我目前正在使用winsock2编程服务器,其中max。工作负载将是大约1000个并发连接。为了接受套接字我正在使用一个在阻塞模式下运行accept()的独立线程。但是为了接收我想到的数据(也有一个单独的线程),但这次使用非阻塞模式和这样的伪代码:

for (;;)
{
    foreach socket
    {
        int num = socket.recv(..);

        if (num == SOCKET_ERROR && WSAGetLastError() == EAGAIN/EWOULDBLOCK)
            continue;
        else
            // push buffer to worker thread / handle error
    }
    thread.sleep(1);
}

这会不会给cpu带来困难吗? 我在互联网上发现的两个主要原因是:cpu load 2.许多内核调用。睡眠解决了第一个问题(我希望),但我不知道接收在非阻塞套接字模式下的调用性能,也不知道为什么许多调用使得这个问题变得很糟糕。

1 个答案:

答案 0 :(得分:0)

不,如果不给CPU带来困难,它将无法工作。当你可以完全阻塞正确的时间时,睡眠实际上是浪费时间。

不要这样做。我无法想象为什么你会在第一时间想到它。