gpt4 book ai didi

c++ - `select`如何同时处理多个事件?

转载 作者:行者123 更新时间:2023-12-03 11:56:59 25 4
gpt4 key购买 nike

我正在尝试了解以下code。如果我有50个与此服务器的连接,并且我通过这些套接字之一发送数据,则带有内部循环的select块将捕获我发送的内容并将其回显。但是,如果在第一封邮件的很短时间内发送另一封邮件,会发生什么情况?如此之快以至于内部循环(在select之后-遍历所有 Activity 客户端套接字的循环)无法完成。该数据会被丢弃吗?下一个select将被触发吗?如果在内循环完成之前发送两条消息会怎样?我是否会遇到这样的情况,即在循环内部遍历所有 Activity 套接字,而得到的多个 Activity 套接字都超过1个,即“两个FD_ISSET(sd, &readfds)在循环的一次迭代中是否为真”?

最佳答案

是的,可以在一次迭代中读取多个描述符。 select()的返回值是已准备好的描述符的数目,并且可以大于1。当您遍历描述符时,应在FD_ISSET(sd, &readfds)为true时增加一个计数器,并继续直到计数器达到该数目。
但是,即使您仅处理一个描述符,也不会丢掉任何东西。 select()不会被更改触发,只要准备好读取(或写入,如果还使用writefds)任何描述符,它就会返回。如果描述符已准备好读取,但您没有从中读取,则下次调用select()时,它将仍准备读取,因此它将立即返回。
但是,如果您只处理在循环中找到的第一个描述符,则如果始终准备读取较早的描述符,而以后再处理,则可能会“饿死”较晚的描述符。因此,通常最好始终处理所有准备好的描述符。

关于c++ - `select`如何同时处理多个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64957366/

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