15

用于线程优先级的疯狂模糊的 pthread api 不仅难以理解,而且在 android 上也不起作用。

那么,有没有办法降低或提高线程的优先级?

int currentPolicy;
struct sched_param sched;
status = pthread_getschedparam(pthread_self(), &currentPolicy, &sched);
printf("sched.sched_priority:%d currentPolicy:%d", sched.sched_priority, currentPolicy);
printf("priority min/max:%d/%d", sched_get_priority_min(currentPolicy), sched_get_priority_max(currentPolicy));

输出:

sched.sched_priority:0 currentPolicy:0

优先级最小/最大:0/0

此外,无论我做什么,pthread_setschedparam 总是为我返回一个错误(无效参数)。在我的代码中,我需要降低处理程序线程的优先级,以确保其他线程使用更多的 cpu 时间。或者,与我的进程中的其他线程相比,我可以提高我想用作更多 cpu 的其他线程的线程优先级。

我有什么办法吗?我只使用本机 C++ 代码。

编辑:从这篇文章看来,android 的线程是某种轻量级进程,应该使用setpriority来修改它们的优先级。看起来该函数有效(getpriority before 和 after 表示优先级已被修改)。但是,我在我的应用程序中看不到预期的效果。

4

3 回答 3

10

Android 线程是 Linux 线程。他们没什么特别的。

setpriority()改变线程的“nice”值,这会影响线程被调度的优先级。

pthread_setschedparam()也可用于更改策略

一般来说,如果没有提升的权限 ( CAP_SYS_NICE),您将无法提高优先级或更改其策略。您可以降低它,或将其提高回“正常”优先级。

如果您使用adb shell ps -t -p,您可以看到分配给每个线程的优先级。此信息也包含在 Dalvik 堆栈转储中。

setpriority()如有必要,Dalvik 使用临时提高 GC 线程的优先级(以避免优先级倒置)。如果您查看第 625 行附近的这段代码,您可以看到它。您还可以看到对 的调用,这是一个更改线程所在cgroupset_sched_policy()的Android 库函数。

于 2013-07-01T18:17:02.617 回答
10

这是简单的答案:使用int nice(int increment). 它在 unistd.h 中声明

这是来自Android的函数代码:

int nice(int increment)
{
    int  priority = getpriority(PRIO_PROCESS, 0);
    return setpriority( PRIO_PROCESS, 0, priority+increment);
}

所以,setpriority可以用来设置线程优先级。

nice(-10)我实际上通过使用或在我的代码中得到了预期的差异nice(10)

于 2013-07-01T20:00:13.543 回答
2

无法在 Android 中设置 POSIX 线程的优先级。nice()和函数配置进程的setpriority()优先级,而不是单个线程的优先级。

于 2013-08-20T16:51:24.010 回答