在嵌入式系统(使用 glibc 2.6.1 的 ARM 处理器上的 Linux 内核 2.6.28)上,我正在运行一个由多个线程组成的应用程序。我希望其中一个线程比其他线程获得更多的 CPU 时间。
设置优先级的一种选择似乎是将pthread
\_setschedparam
与SCHED
\ _RR
(或SCHED
\ _FIFO
)一起使用,但是这会给线程带来太多的 CPU(除非它休眠,否则它会从仍在使用的其他线程中吃掉所有 CPU SCHED_OTHER
)。
另一种选择是设置线程的好级别。然而,虽然这正是我正在寻找的(线程只是获得更多的 CPU,但不能饿死其他线程),但我无法让它正常工作。根据手册页“线程不共享一个共同的好值”,我将其解释为我可以为同一进程中的不同线程设置单独的好值。
这是我的代码:
pid_t tid;
tid = syscall(SYS_gettid);
int ret = setpriority(PRIO_PROCESS, tid, priority);
但是,所有线程中的 tid 似乎都是相同的。此外,在调用getpriority
. 从性能来看,这是一致的(即用相同的任务运行线程 A 和线程 B,然后将 A 设置为 -19,将 B 设置为 19,两者将在大致相同的时间完成)。
然而,当运行线程 A 时,将其设置为 -19,然后运行 B 并将其设置为 +19 将使 B 以全功率运行(完成方式领先于 A)。
所以看起来一个线程会在运行时使用漂亮的级别集,之后无法更改它。
我疯狂地在谷歌上搜索更多信息或任何形式的确认,但到目前为止我发现的都是相当模糊的。这里有人对Linux(2.6.28,glibc 2.6.1)上处理线程的良好级别有任何描述吗?我怎么可能改变已经运行的线程的好级别?