0

如果我有以下带有 select 调用的代码,并假设套接字 fds 在大多数情况下都没有为 I/O 做好准备,那么线程会占用 CPU 还是会休眠并让另一个线程完成工作。select() 是 CPU 密集型调用吗?

while(1)
{
   select(maxfd, &rfds, NULL, NULL, NULL);
}

行为是否与超时 = 0(轮询类型)而不是 NULL 相同。

4

1 回答 1

2

如果超时值为 NULL,则 select 将无限期地阻塞,直到 rfds 中的套接字和文件描述符上有数据可用。但是,一旦该集中的任何文件描述符上的数据可用,您拥有的代码将消耗整个 CPU,因为您没有显示任何建议从套接字中排出数据的内容。(第二次调用 select 将立即返回,表明套接字上仍有数据)。

如果您传入一个归零的时间值来选择,这将是一个非阻塞轮询。它等效于调用带有 MSG_DONTWAIT 标志的 send() 或 recv() (但不复制数据)。

于 2013-05-19T18:41:02.083 回答