2012-03-10 31 views
1

現在我想在我的程序中創建三個進程,每個進程中都有幾個線程。
而每個線程都是無限的任務,可能會睡眠並定期被喚醒。此外,這個過程還有一些任務要做。
我的問題是:如何在Linux中設置線程的屬性?

1)我是否需要將線程設置爲分離?如果我將線程設置爲分離,它們似乎不會運行! 但是,如果線程爲可連接的,則進程必須等待線程退出並且它不能完成它自己的工作! 哪一個我應該選擇?

2)調度策略的範圍是什麼?我的意思是,如果我將調度策略設置爲FIFO,則所有進程中的所有線程都由FIFO策略調度?或者只是使用此策略設置的線程按此策略進行安排?

3)線程優先級的範圍是什麼?線程優先級在單個進程中很有用,而在另一個進程中,存在另一組線程優先級。而且它們不會互相感染?

我將不勝感激您的幫助!謝謝!

回答

0

(1)您有一個編碼錯誤。分離的線程像其他事物一樣獲得時間片。如果它沒有運行,那麼這是你正在做的事情。你應該發佈你的threadfunc和在另一個問題中創建線程的函數。

不可能說你的線程在不知道你在做什麼時應該可以連接或分離。可連接線程的主要好處是你知道它們何時完成,你可以檢查返回數據。如果這些對你來說並不重要,那麼使它們可聯結並沒有真正的優勢 - 除了創建它們稍微容易些,因爲這是默認設置。

如果你不想在pthread_join中阻塞,你可以追求策略。你的線程可以在開關死前設置開關,你可以使用條件變量,你可以有一個單獨的線程來連接死線等等。再次,不可能知道什麼是您的特定情況的最佳策略。 3)一個線程會繼承創建它的線程的調度策略和優先級,並且它們保持這種方式,除非您專門更改它們。一個進程中的線程策略/優先級與任何其他進程都沒有直接關係。

+0

令人印象深刻的答案!!!非常有用!謝謝! – city 2012-03-10 04:03:39

0

我只回答的第一個問題:

無需創建線程沾邊,因爲你可以簡單地在主過程結束加入他們的行列。

創建線程沾邊,你應該先創建一個屬性,然後把它作爲一個參數pthread_create

pthread_t thread1; 
pthread_attr_t attr; 

int chk; 

chk = pthread_attr_init(&attr); 
printf("attr_init: %d\n",chk); 

chk = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
printf("attr_setdetachstate: %d\n",chk); 

chk = pthread_create(&thread1, &attr, function, NULL); 
+0

謝謝你的回答。 – city 2012-03-10 03:58:42

1

分離或連接:這取決於您需要的需求類型。

如果您希望主執行線程(它產生新線程)需要繼續工作,並且不需要等待生成的線程返回值,則可以使用DETACH。

如果您需要主執行線程,只需等待返回值並且不需要自行執行任何其他任務。您可以使用JOIN。

創建線程時,它會在調用pthread_create之前使用默認的調度策略,除非通過屬性進行更改。同樣在創建之後,您可以動態更改調度策略。注:調度策略會影響具有相同優先級的線程。

優先級:您可以使用pthread_setschedparam(也用於調度策略)更改優先級。 但是,在Linux線程中也是一個輕量級的過程。所以,所有線程都優先考慮整個進程級別,而不是在每個進程內。

+0

你的意思是整個程序只有一個時間表策略?而且,無論在哪個過程中,所有的線程在整個程序中都被重新歸類爲同一組優先級? – city 2012-03-10 05:51:12

+0

優先級和調度在線程級別設置。將每個線程看作是進程本身。如果進程P1具有調度策略Sched1和Sched2的Th1,Th2線程。進程P2具有線程Th3,Th4分別具有調度策略Sched1,Sched2。因此,操作系統使用Sched1機制和Th2,Th4使用Sched2機制(假設線程具有相同的優先級)來調度Th1,Th3。同樣,如果P1有5個Pr1線程和另外3個Pr2線程。如果P2有2個Pr1。 P1(5 threds)+ P2(2個線程),每個線程將獲得OS的1/7時間片(假設調度策略相同)。 – vamsi 2012-03-10 06:17:25