几天前,我不得不调查一个问题,即我的应用程序(显然)处于空闲状态时显示出异常高的CPU使用率。我将问题跟踪到一个循环,该循环旨在在套接字已设置为recvfrom的情况下阻止O_NONBLOCK调用,从而导致自旋锁。有两种方法可以解决此问题:使用pollselect将套接字设置为阻塞或轮询套接字上的可用数据。我选择了前者,因为它更简单。但是我想知道为什么有人会创建一个非阻塞套接字,然后分别对其进行轮询。插口 socket 不一样吗?在哪些情况下将使用无阻塞套接字和轮询组合?在一般情况下,它有什么优势吗?

最佳答案

poll()select()与非阻塞文件描述符一起使用将为您带来两个好处:

  • 您可以设置一个超时来阻止;
  • 您可以等待一组文件描述符中的任何一个变得可用。

  • 如果只有一个文件描述符(套接字)要等待,并且您不介意无限期地等待它,则可以;您可以使用阻止调用。

    第二个优势确实是select()和 friend 的杀手级用例。这意味着您可以通过单个控制线程处理多个套接字连接,以及标准输入和标准输出以及可能的文件I/O。

    关于c - 非阻塞式 socket ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3360797/

    10-16 11:25