gpt4 book ai didi

android - Android 的 c++11 多线程问题,其中某些线程未正确安排

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:53 26 4
gpt4 key购买 nike

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

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

引用后change native thread priority on Android ,我还尝试将所有线程的“nice”值更改为 -10,但没有成功。需要注意的是,完全相同的 C++ 代码在 iOS 上运行得非常好。

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

最佳答案

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 已经使用用户选择的超时,我的解决方案起作用也很奇怪,因此我认为它无论如何都会在内部休眠。显然不是在 Android 上。

关于android - Android 的 c++11 多线程问题,其中某些线程未正确安排,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27439183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com