gpt4 book ai didi

linux - 非阻塞 I/O 问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:51 24 4
gpt4 key购买 nike

我对套接字上的异步 I/O 没有太多经验。最近我不得不实现一个 TCP 客户端,它将在一个单独的线程中连接到服务器并等待输入数据,并且以非阻塞方式等待输入数据,以便通过简单地从控制线程设置一些标志变量来立即终止线程。我的解决方案是将套接字设置为非阻塞并实现一个循环,如果 errno 是 E_WOULDBLOCK 则一遍又一遍地调用 recv 并在不再设置标志变量 run 时退出循环。是这样的:

while(run) {
if( -1 == recv(...))
{
if(errno == E_WOULDBLOCK)
continue;
else
break;
}
else
{
process_data(...);
}
}

问题是:这个解决方案在 CPU 使用率方面有多好?使用 select/poll/epoll 会更有效吗?

还有一个问题:有什么方法可以使阻塞的selectreadconnnect 调用立即从其他线程返回?

最佳答案

The question is: how good is this solution in terms of CPU usage? Will using select/poll/epoll be more effective?

非常效率低下。这可能是处理多个连接的最糟糕的方式。考虑到每个 recv 都是一个系统调用:它需要上下文切换。上下文切换并不昂贵,但在高频循环中计算上下文切换可能会占用 CPU。此外,如果您要在一次通话和另一次通话之间休眠,以“软化循环”,您最终会在数据接收和处理之间付出延迟;您拥有的联系越多,感觉就越高。

select 基本上是告诉内核:“我希望这些 fds 集由您监控,并在发生某些事情时立即发出信号。”。您的流程将进入等待状态,并在传递事件时准备就绪。同时,CPU 可能为其他进程服务。

您可以使用阻塞多路复用器并在单独的线程(可能来自线程池)中处理每个工作,这是非常有效的。但这取决于你在做什么。

And another one question: is there any way to make blocked select, read or connnect call return immediately from other thread?

嗯,是的。但这是你想要的吗?正如@alk 所说,您可以向他们发送信号。此外,对于 recvconnect,您可能希望使用 select/poll 或任何其他带超时的多路复用器特性;不过,它可能更难编程。

关于linux - 非阻塞 I/O 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877526/

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