在嵌入式系统(使用glibc 2.6.1的ARM处理器上的Linux内核2.6.28 )上,我正在运行一个由多个线程组成的应用程序。我希望其中一个线程比其他线程获得更多的CPU时间。
设置优先级的一种选择似乎是将pthread \ _setschedparam与SCHED \ _RR (或SCHED \ CPU )一起使用,但是这会给线程提供太多的CPU (除非它休眠,否则它会吃掉仍在使用SCHED_OTHER的其他线程的所有CPU)。
另一种选择是设置线程的良好级别。然而,虽然这正是我想要的(线程只会获得更多的CPU,但不会让其他线程挨饿),但我无法让它正常工作。根据手册页“线程不共享共同的nice值”,我将其解释为我可以在同一进程中为不同的线程设置单独的nice值。
下面是我的代码:
pid_t tid;
tid = syscall(SYS_gettid);
int ret = setpriority(PRIO_PROCESS, tid, priority);但是,似乎所有线程的tid都是相同的。此外,在调用getpriority时,为线程设置单独的nice级别仍然会返回所有线程中最新设置的nice级别。从性能上看,这是一致的(即,使用相同的任务运行线程A和线程B,然后将A设置为-19,将B设置为19,两者将以大致相同的时间完成)。
然而,当运行线程A,然后将其设置为-19,然后运行B并将其设置为+19时,B将以最大功率运行(远远领先于A)。
因此,看起来线程将使用运行时设置的很好的级别,以后无法更改它。
我疯狂地在谷歌上搜索更多信息或任何形式的确认,但到目前为止我找到的都是相当模糊的信息。这里有没有人能描述一下Linux (2.6.28,glibc 2.6.1)上的线程级别是如何处理的?我怎么可能改变一个已经运行的线程的良好级别呢?
发布于 2009-05-23 21:56:22
嗯,一旦我发布了这个问题,我突然意识到我的错误-我通过从主线程调用函数来设置nice级别,所以它们当然都有相同的线程ID (因为它是在主线程的上下文中执行的)。哇!
使用正确的tid,一切工作正常。
现在我该如何删除这个问题?
https://stackoverflow.com/questions/902539
复制相似问题