在embedded式系统上(使用glibc 2.6.1的ARM处理器上的Linux内核2.6.28)我正在运行一个由多个线程组成的应用程序。 我想这些线程之一获得更多的CPU时间比其他人。
设置优先级的一个select似乎是使用带有SCHED
\ _RR
(或SCHED
\ _FIFO
)的pthread
\ _setschedparam
,但是这给了线程太多的CPU(除非它睡着了,它从它的同类线程中吃掉所有CPU使用SCHED_OTHER
)。
另一个select是设置线程的好水平。 但是,虽然这正是我正在寻找(线程只是得到更多的CPU,但不能饿死其他线程),我不能让它正常工作。 根据手册页“线程不共享一个很好的价值”,我认为,我可以在同一个过程中,为不同的线程设置个人的好价值。
这是我的代码:
pid_t tid; tid = syscall(SYS_gettid); int ret = setpriority(PRIO_PROCESS, tid, priority);
但是,似乎所有线程中的tid都是一样的。 在调用getpriority
时,为线程设置单独的nice级别仍然会在所有线程中返回最新的设置级别。 从性能上看,这是一致的(即运行线程A和线程B的任务相同,然后将A设置为-19,将B设置为19,两者大致同时完成)。
然而,当运行线程A,然后将其设置为-19,然后运行B并将其设置为+19时,B将以全功率运行(在A之前完成)。
所以看起来像一个线程将使用运行时设置好的级别,而不会在之后进行更改。
我疯狂search了更多的信息或任何forms的确认,但迄今为止我发现的是相当模糊的。 有没有人有任何描述可用于在Linux(2.6.28,glibc 2.6.1)上处理线程的好程度? 而我怎么可能改变一个已经运行的线程的好水平?
Errm,一旦我发布这个问题,我突然意识到我的错误 – 我通过从主线程调用函数来设置好级别,所以它们当然都具有相同的线程ID(因为它是在主线程的上下文中执行的) 。 DOH !!!!
使用正确的tid一切工作正常。
现在我该如何删除这个问题?