代码样例一(正确用法):
while (true) {
FD_ZERO(&readfds);
FD_SET(socket_fd, &readfds);
time_wait.tv_sec = 0;
time_wait.tv_usec = 500000;
ret = select(socket_fd+1, &readfds, NULL, NULL, &time_wait);
if ((ret <= 0) || (!FD_ISSET(socket_fd, &readfds))) {
continue;
}
// TODO: read socket
}
代码样例二(错误用法):
time_wait.tv_sec = 0;
time_wait.tv_usec = 500000;
while (true) {
FD_ZERO(&readfds);
FD_SET(socket_fd, &readfds);
ret = select(socket_fd+1, &readfds, NULL, NULL, &time_wait);
if ((ret <= 0) || (!FD_ISSET(socket_fd, &readfds))) {
continue;
}
// TODO: read socket
}
select()传入的第5个参数,time_wait变量是传入的指针,select()函数内部会改变此参数的值,以供调用者获得select()的执行耗费时长。
因此,第5个参数必须每次调用select()之前重新赋值,否则会使select()函数执行阻塞时间为0。从而导致该线程一直占用cpu资源。

本文探讨了在使用select()系统调用进行I/O多路复用时,因忽视时间参数而导致的线程资源浪费问题。正确的做法是在每次调用select()之前重新设置超时时间,以避免线程无限占用CPU。错误的代码样例可能导致select()阻塞时间为0,使得程序陷入无效率的循环。理解并修正这一问题对于优化系统性能至关重要。
1028

被折叠的 条评论
为什么被折叠?



