gpt4 book ai didi

c - 如何仅循环遍历来自 select() 的 fd_set 结果的事件文件描述符?

转载 作者:太空狗 更新时间:2023-10-29 17:18:06 30 4
gpt4 key购买 nike

所以在我当前的服务器实现中,它目前是这样的:

  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(仅在添加/删除 channel 时使用 FD_SET、FD_CLR)将是更好的处理方式。

我的问题是,如何在不使用 FD_ISSET 的情况下在 select() 之后循环遍历 fd_set,而不检查集合中的每个成员是否属于集合?

我的意思是,当您有 4000 个事件连接时,只要有传入数据,上述循环就必须经过 4000 个套接字才能到达正确的套接字。如果所有线程都处于事件状态,那么复杂度将是 n^2!

最佳答案

My question is, how can you loop through the fd_set after select(), without checking each member of the set if it's part of the set, without using FD_ISSET?

你不能。

select() 返回就绪描述符的数量有一个轻微的优化,所以如果你记录你已经处理的数量,当你知道你已经完成所有这些时你可以停止无需走到集合的末尾。

I mean, when you have 4000 active connections, whenever there's incoming data, the above loop will have to go through a potential of 4000 sockets before getting to the right one. The complexity would be n^2 if all the threads are active a lot!

我不知道你从哪里得到 O(n^2)。当然,从 select() 返回后,您将在途中处理每个就绪的描述符时遍历集合。如果您有 4,000 个就绪的 IO 描述符,则循环遍历内存中 4,000 个 C 对象数组的开销将相当微不足道。

关于c - 如何仅循环遍历来自 select() 的 fd_set 结果的事件文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474232/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com