select(2)超时时出现奇怪的行为

时间:2012-10-23 15:45:14

标签: android android-ndk pjsip

检查pjsip的socket select的性能,我发现了一个非常奇怪的超时行为。 socket_select.c中的源代码如下:

struct timeval os_timeout, *p_os_timeout;

PJ_CHECK_STACK();

PJ_ASSERT_RETURN(sizeof(pj_fd_set_t)-sizeof(pj_sock_t) >= sizeof(fd_set),
                 PJ_EBUG);

if (timeout) {
os_timeout.tv_sec = timeout->sec;
os_timeout.tv_usec = timeout->msec * 1000;
p_os_timeout = &os_timeout;
} else {
p_os_timeout = NULL;
}

return select(n, PART_FDSET_OR_NULL(readfds), PART_FDSET_OR_NULL(writefds),
      PART_FDSET_OR_NULL(exceptfds), p_os_timeout);

我已经检查过,并且传递给select函数的所有参数都是正确的,并且选择后总是将超时值重新初始化为正确的值。 n如果还设置为最大使用文件描述符。

问题在于,有时候,超时被正确触发并以0退出,但有时,它会被随机时间段(从某些msecs到分钟)阻塞,同时返回0。

我目前正在检查每个fd_set中的内容,以防万一,但如果有人知道可能出现的问题我真的很感激。

1 个答案:

答案 0 :(得分:0)

问题很可能不在socket_select.c中。你在哪里打电话给选择?您是否使用多个线程并从另一个线程调用select?您可以发布您的代码或提供链接吗?