Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
如果我有以下带有 select 调用的代码,并假设套接字 fds 在大多数情况下都没有为 I/O 做好准备,那么线程会占用 CPU 还是会休眠并让另一个线程完成工作。select() 是 CPU 密集型调用吗?
while(1) { select(maxfd, &rfds, NULL, NULL, NULL); }
行为是否与超时 = 0(轮询类型)而不是 NULL 相同。
如果超时值为 NULL,则 select 将无限期地阻塞,直到 rfds 中的套接字和文件描述符上有数据可用。但是,一旦该集中的任何文件描述符上的数据可用,您拥有的代码将消耗整个 CPU,因为您没有显示任何建议从套接字中排出数据的内容。(第二次调用 select 将立即返回,表明套接字上仍有数据)。
如果您传入一个归零的时间值来选择,这将是一个非阻塞轮询。它等效于调用带有 MSG_DONTWAIT 标志的 send() 或 recv() (但不复制数据)。