2017-10-12 122 views
0

我的程序有一些線程,主循環沒有功能。我用while(1){sleep(1);}來編寫主循環。linux線程,主要睡眠

我現在問自己,但不能肯定是否性能明智的空主循環(while(1){})比睡眠(1)好,反之亦然,或相同?

我認爲,調度檢查,在每個調度週期的每個任務,看看他們是否需要被喚醒,它的作用:

  • 時主要是空while循環:醒來的時候,什麼都不做

  • 主要是時睡眠循環:喚醒時間戳檢查/重新計算,如果被喚醒的需求,再醒來什麼都不做

進行任何迪菲分配辦法?

+0

我會使用'pause()'而不是'sleep(1)'。它就像睡眠()一樣,但有無限的超時時間。它會較少頻繁地喚醒(僅限於信號),因此它將消耗更少的資源。 – rodrigo

回答

2

有很大的差異。睡眠(1)版本比空(1){}更好。 (1)讓系統內核檢查時間,當時間報警到達時,它會運行下一步。所以它只需要一點資源。但是while(1){}是不同的,它會一直運行語句「while(1)」,它將花費大量的CPU資源(它可以獲得的所有資源)。

可以使用top命令來檢查資源使用情況,你會發現睡眠(1)版本使用只有一點點資源,而「而(1){}」使用100%的CPU(一個CPU核心/線程)

1

當你使用線程時,最好的選擇可能是在主線程中沒有循環,但是join操作等待其他線程完成。

0

我錯誤的空while循環,其中所有剩餘的CPU作爲peter__barnes提到。我真正的程序在main()中有這個:while(someCondition){//空循環}。 someCondition()裏面有一些信號在等待。我只是想在main()中將main()中的空循環與我在while(1){sleep(1);}中的其他程序進行比較。但是這並不是一個空的循環。所以我的問題是錯誤的,但無論如何,它已經打開了我以前不知道的事情和後續問題:

如果我的程序是永遠不會退出的守護程序,則爲pause()或在main()中加入()更好?