Android 的 c++11 多线程问题,其中某些线程未正确调度
c++11 multithreading issues with Android where some threads are not scheduled properly
我正在开发一个基于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 已经使用了用户选择的超时,因此我认为它无论如何都会在内部休眠。显然不是在安卓上。
相关文章:
- 更改线程实时调度策略失败:config_rt_group_sched = y
- 从调度队列块 [ swift / c++ ] 创建线程
- 用管道在C++中创建调度队列/线程处理程序:FIFO溢出
- C 1Z Coroutine线程上下文和Coroutine调度
- 在多线程中调度任务
- 在进程中调度线程
- 调度线程时的 void* 指针转换
- 如何确定流程的"经理"和"工作线程"线程的优先级(或为其设置调度策略)?
- 如何在 C++11 中调度线程
- Android 的 c++11 多线程问题,其中某些线程未正确调度
- 在后台线程上创建的调度程序未关闭时会发生什么情况?如何确保调度程序已正确关闭
- 线程调度程序模拟:唤醒和睡眠Pthread的正确方法
- xiAPI:无法更改线程调度程序,请检查实时优先级的用户限制
- 大中央调度块线程安全吗?
- 调度基于Posix的线程
- 如何调度/创建用户级线程,以及如何创建内核级线程
- 在Qt应用程序中自定义线程调度
- 调度大量线程,因此只有4个线程并行执行
- 如何在 boost::wait_for_any 中正确调度任务,同时考虑到线程数
- 如何使用boost::asio::io_service在c++ 11线程之间调度作业