几天前,我不得不调查一个问题,即我的应用程序(显然)处于空闲状态时显示出异常高的CPU使用率。我将问题跟踪到一个循环,该循环旨在在套接字已设置为recvfrom
的情况下阻止O_NONBLOCK
调用,从而导致自旋锁。有两种方法可以解决此问题:使用poll
或select
将套接字设置为阻塞或轮询套接字上的可用数据。我选择了前者,因为它更简单。但是我想知道为什么有人会创建一个非阻塞套接字,然后分别对其进行轮询。插口 socket 不一样吗?在哪些情况下将使用无阻塞套接字和轮询组合?在一般情况下,它有什么优势吗?
最佳答案
将poll()
或select()
与非阻塞文件描述符一起使用将为您带来两个好处:
如果只有一个文件描述符(套接字)要等待,并且您不介意无限期地等待它,则可以;您可以使用阻止调用。
第二个优势确实是
select()
和 friend 的杀手级用例。这意味着您可以通过单个控制线程处理多个套接字连接,以及标准输入和标准输出以及可能的文件I/O。关于c - 非阻塞式 socket ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3360797/