2011-10-07 283 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