2011-10-07 282 views
16

nice手冊頁說:「好()增加了增量爲調用進程的nice值所以,我們可以用它來改變nice值由pthread_create是nice()用來改變線程優先級還是進程優先級?

編輯創建的線程:? 我們似乎可以設置每個線程的好價值

我寫了一個應用程序,爲不同的線程設置不同的nice值,並觀察到「較好」的線程已經被調度爲較低優先級。發現字符串「高優先級................」被輸出的次數更多。

void * thread_function1(void *arg) 
{ 

pid_t tid = syscall(SYS_gettid); 

int ret = setpriority(PRIO_PROCESS, tid, -10); 
printf("tid of high priority thread %d , %d\n",tid ,getpriority(PRIO_PROCESS,tid)); 
while(1){ 
    printf("high priority ................\n"); 
    } 

} 


void * thread_function(void *arg) 
{ 
pid_t tid = syscall(SYS_gettid); 
int ret = setpriority(PRIO_PROCESS, tid, 10); 
printf("tid of low priority thread %d , %d \n",tid ,getpriority(PRIO_PROCESS,tid)); 
while(1) 
{ 

    printf("lower priority\n"); 
} 
} 


int main() 
{ 

pthread_t id1; 
pthread_t id2; 

pid_t pid = getpid(); 
pid_t tid = syscall(SYS_gettid); 

printf("main thread : pid = %d , tid = %d \n" , pid, tid); 
pthread_create(&id1, NULL, thread_function1, NULL); 
pthread_create(&id2, NULL,thread_function, NULL); 

pthread_join(id1, NULL); 
pthread_join(id2, NULL); 


} 

回答

21

pthreads man page說:

POSIX.1還要求線程共享的範圍內的其他屬性 的(即,這些屬性是進程範圍,而不是每個線程):

[ ...]

  • nice值(setpriority(2))

因此,理論上,「niceness」值對於進程是全局的,並且是所有線程共享的,並且您不應該爲一個或多個單獨的線程設置特定的好處。

然而,非常相同的人頁面還表示:

的LinuxThreads

這個實現的顯着特點如下:

[...]

  • 線程不具有共同的好價值。

NPTL

[...]

NPTL仍然有一些不符合與POSIX.1:

  • 線程不共用一個很好的價值。

所以事實證明,無論在Linux線程實現(Linux線程和NPTL)實際上違反POSIX.1,你可以通過傳遞一個tidsetpriority()這些設置特定的正派爲一個或多個單個線程系統。

+1

但爲什麼在某些JVM實現中,java線程優先級與nice值具有1:1映射關係? //www.javamex.com/tutorials/threads/priority_what。shtml另外,我寫了一個應用程序,爲不同的線程設置不同的好值,並且觀察到較好的線程已經被安排在較低的優先級,通過檢查輸出的頻率。 – pierrotlefou

+0

@pierr,有趣的是,事實證明,NPTL和Linux線程都違反了POSIX.1。我會更新我的答案。 –

+0

@FrédéricHamidiLinux上的線程仍然沒有共享一個很好的價值嗎? – blueskin