【发布时间】:2015-01-10 14:54:35
【问题描述】:
我对套接字上的异步 I/O 没有太多经验。最近,我必须实现一个 TCP 客户端,它将在单独的线程中连接到服务器并等待输入数据,并且以非阻塞方式,以便可以通过简单地设置控制线程的一些标志变量来立即终止线程。我的解决方案是设置套接字非阻塞并实现一个循环,如果 errno 是 E_WOULDBLOCK 并在标志变量 run 不再设置时退出循环,则一遍又一遍地调用 recv。是这样的:
while(run) {
if( -1 == recv(...))
{
if(errno == E_WOULDBLOCK)
continue;
else
break;
}
else
{
process_data(...);
}
}
问题是:这个解决方案在 CPU 使用率方面有多好?使用 select/poll/epoll 会更有效吗?
还有一个问题:有没有办法让阻塞的select、read或connnect调用立即从其他线程返回?
【问题讨论】:
-
语言是什么(C、C++)!?
-
最好是:
if ((errno == E_WOULDBLOCK) || (errno == EAGAIN)) -
@alk,sometimes,是的。
-
注意,在 Linux 上,recv may block after select,因此同时使用非阻塞 IO 和选择。
标签: linux multithreading sockets unix io