2014-02-13 46 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