2013-07-01 91 views
11

疯狂地隐藏线程优先级的pthread api不仅难以理解,而且它在android上不起作用。在c/C++中更改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之前和之后表示优先级已被修改)。但是,我在我的应用程序中看不到预期的效果。

+0

“* ... pthread_setschedparam总是为我返回一个错误(无效参数)。*”,那么你介意告诉我们你传递给函数的东西,让它返回'EINVAL'吗? – alk

+0

currentPolicy我试图通过所有可用的值(0,1,2,3)。对于sched.sched_priority,我尝试设置不同的值(-10,10等)。全部失败。 – Pavel

回答

8

下面是简单的答案:使用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)

+1

我应该在哪里放置这段代码?是线程还是进程?另外,什么是回报价值?谢谢 – RonTLV

+0

FWIW看起来像是在'' – nmr

+0

@nmr中声明的那样。5年前,它可能不是 – Pavel

7

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

setpriority()改变线程的“好”的价值,这会影响在该调度线程的优先级。

pthread_setschedparam()也可用于更改政策

一般来说,你不能提升优先级或改变其策略,而提升的权限(CAP_SYS_NICE)。您可以降低它,或将其提升回“正常”优先级。

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

的Dalvik使用setpriority()如果需要临时提高GC线程的优先级(为了避免优先级反转)。如果你看第625行的this bit of code,你可以看到它。您还可以看到呼叫set_sched_policy(),这是一个Android库函数,用于更改线程所在的cgroup

+1

这很接近。 'nice(int)'应该在使用setpriority的android上使用。其他一切都不起作用。我也试图搜索整个android源代码,并没有使用其他功能。 – Pavel

0

没有办法设置在Android上POSIX线程的优先级预期在我的代码。 nice()setpriority()函数配置进程的优先级,而不是单个线程的优先级。

+1

这个错误,我已经自己验证了它。 nice&set-priority(默认)适用于android本机世界中的一个linux LWP。您的困惑可能源于事实,即所有启动的主题都会触发优先事项。所以如果你在启动子/线程之前设置了prio,那么所有的都有这个prio。 – voidStar

+0

购买并不意味着您可以在创建/运行后更改给定线程的策略/优先级。 –