Android 的 c++11 多线程问题,其中某些线程未正确调度

c++11 multithreading issues with Android where some threads are not scheduled properly

本文关键字:线程 调度 c++11 多线程 问题 Android      更新时间:2023-10-16

我正在开发一个基于VoIP的应用程序,它是多线程的。每个套接字都有一个 c++11 std::thread(包括 SSL 读写)。数据通信的核心模块在C++通过JNI接口调用。

我的观察是,一旦在几秒钟后初始化应用程序,一些较早运行的线程通常不会获得运行时间。如果某个线程正在运行,那么它会继续运行一段时间,范围从 3-4 秒到 30-40 秒不等。

在 Android 上引用更改本机线程优先级后,我还尝试将所有线程的"nice"值更改为 -10,但没有运气。重要的是要注意,完全相同C++代码在iOS上运行良好。

Android 原生线程调度是否存在问题,还是我遗漏了什么?

while (...) {
 int selectResult = select( fd, ...);
 if ( selectResult > 0 ) DoSomeWork( fd );
 else nanosleep(...); /* this is the new line which solved my stalling threads */
}

遇到了类似的问题,并发现就我的情况而言,解决方案是验证那些具有永恒循环的线程(不断执行选择,直到套接字上有东西生成处理程序线程)始终在其循环中至少调用一次 nanosleep。

像你一样,我在Android上遇到了这个问题,而在iOS上没有问题。

我只能假设 Android 上的 JVM 有时会将完全优先级分配给一个线程,该线程只轮询套接字而不暂停,这样其他有实际工作要完成的线程会停滞不前。但我不知道如何验证这个假设。

我的解决方案有效也很奇怪,因为 select 已经使用了用户选择的超时,因此我认为它无论如何都会在内部休眠。显然不是在安卓上。