【发布时间】:2011-03-29 14:33:23
【问题描述】:
所以在我当前的服务器实现中,目前是这样的:
void loop(){
// step 1: clear set
fd_set readfds;
while(true){
// step 1:
FD_ZERO(readfds);
// step 2:
loop_through_sockets_and_add_active_sockets_to(theset);
// step 3:
switch(select(FD_SETSIZE, &readfds, 0, 0, &tv)) {
case SOCKET_ERROR:
patia->receiveEvent(Error, net::getError());
return;
case 0:
return;
}
// step 4:
loop through sockets and check, using FD_ISSET,
which read fd's have incoming data.
}
}
现在,不清除 fd_set(仅在添加/删除通道时使用 FD_SET、FD_CLR)将是一种更好的处理方式。
我的问题是,如何在 select() 之后循环遍历 fd_set,而不检查集合的每个成员是否是集合的一部分,而不使用 FD_ISSET?
我的意思是,当您有 4000 个活动连接时,每当有传入数据时,上述循环必须经过潜在的 4000 个套接字才能到达正确的套接字。如果所有线程都非常活跃,复杂度将是 n^2!
【问题讨论】:
-
使用 poll(2) 代替(或 epoll)