疯狂地晦涩的pthread api线程优先级不仅是陌生的不可理解,而且它只是在
Android上不起作用.
那么,有没有办法减少或增加线程的优先级?
int currentPolicy; struct sched_param sched; status = pthread_getschedparam(pthread_self(),¤tPolicy,&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
priority min/max:0/0
另外,无论我做什么,pthread_setschedparam总是为我返回一个错误(参数无效).
在我的代码中,我需要减少我的处理程序线程的优先级,以确保其他线程使用更多的cpu时间.或者,或者,我可以提高我的其他线程的线程优先级,我想要使用更多的cpu与我的过程中的其他线程相比.
有没有办法让我这样做?我只使用本机c代码.
编辑:从这个帖子看起来像android的线程是一些轻量级的进程和修改优先级为他们setpriority应该使用.它看起来功能正常(前后的getpriority表示优先级被修改).但是,我的应用没有看到预期的效果.
解决方法
Android线程是Linux线程.没什么特别的.
setpriority()改变线程的“nice”值,这会影响线程被调度的优先级.
pthread_setschedparam()也可用于更改策略.
一般而言,如果没有提升的权限(CAP_SYS_NICE),您不能提高优先级或更改其策略.您可以降低它,或将其提高回“正常”优先级.
如果您使用adb shell ps -t -p,您可以看到分配给每个线程的优先级.此信息也包含在Dalvik堆栈中.
Dalvik使用setpriority()临时提高GC线程的优先级,以避免优先级反转.如果你看第625行周围的this bit of code,你可以看到它.您还可以看到set_sched_policy()的调用,这是一个更改线程所在的cgroup的Android库函数.