Android 选择(2)超时时的奇怪行为

Android 选择(2)超时时的奇怪行为,android,android-ndk,pjsip,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_t

在检查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退出,但有时它会被阻塞一段随机时间(从几毫秒到几分钟),也返回0


我目前正在检查每个fd_集合中的内容,以防万一,但如果有人知道可能出现的问题,我将不胜感激。

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

源代码只是pjsip的1.x分支版本4109。这是从ioqueue_select.c(在pj_ioqueue_poll中)调用的pj_sock_select的代码。另一方面,我创建了一个基本的select测试应用程序,我看到,当有套接字活动时,超时也会有一些延迟(不是很大,大约7或8毫秒)。所以,我认为,Android的select实现中应该存在一个问题。我记得有一个使用Android NDK构建PJSIP 1.8.10的补丁。查看您的PJSIP版本是否也需要补丁您是否使用最新版本的Android NDK?如果你使用PJSIP2.x,你会发现有什么不同吗?谢谢你的链接,但是我已经在使用这个补丁了,还有一些其他的改进。我不是在使用最新的NDK,而是7,我会尽快尝试PJSIP2.0,但是套接字的源代码与1.8中的源代码相同。另一方面,我检查了Android的通用内核源代码,我认为,如果文件操作的轮询回调被阻止,问题可能出现在select的实际实现中。我正在努力解决这个问题,但现在运气不佳:-(