2014-02-13 47 views
4

我在Linux(3.4)中有一个实时线程。在某些条件下,即使它没有完成当前时间片的使用,我也希望它将控制权交给具有相同优先级的其他线程。我想用下面的代码:从linux内核产生

if (condition) { 
    resched_task(); 
    cond_resched(); 
} 

不过,我没有看到任何人在代码中这样做,让我觉得有一些其他的(更好吗?)这样做的方式。有没有一个标准的方法来做到这一点?

回答

6

您可以使用sched_yield()函数来产生时间片的其余部分,即as discussed here

sched_yield()会导致调用线程放弃CPU。线程移动到队​​列的末尾以获得其静态优先级,并且新线程运行。

+0

谢谢。你不知道sched_yield()和yield()之间的区别吗? – John

+0

@John你在说什么yield()函数?我不知道一个简单的'yield()',对不起。 – TypeIA

+0

在core.c(第5029行)中,有一个叫做yield的函数。在函数的顶部有一个很大的警告:'千万不要使用这个函数,有99%的机会你做错了。'...它最终调用sys_sched_yield(),这让我有点疲倦。 – John

0

这个问题听起来像是在询问内核编程,但接受的答案是函数用户模式API sched_yield()。我认为这个问题的内核答案是schedule()

+2

schedule()如果时间片是放在runqueue的后面不起来,这意味着你最终再次醒来。 yield()会把你推到后面,允许下一个进程运行。经过一番分析,我们发现'yield()'实际上是正确的调用,尽管上面有注释。 (注意 - 这只适用于RR runqueues) – John

+0

@John你确定schedule()没有把它放在队列的末尾吗?那么它的目的是什么。我们放弃cpu立即被唤醒吗? – Karthik