2011-10-07 19 views
16

Strona man dla nice mówi „nice() dodaje inc do wartości nice dla procesu wywołującego Tak, możemy użyć go, aby zmienić wartość nice dla wątku stworzonego przez pthread_createjest ładne() używane do zmiany priorytetu wątku lub priorytetu procesu?

EDIT:.? Wygląda na to, że możemy ustawić ładną wartość na wątek:

Napisałem aplikację, ustawiając inną ładną wartość dla różnych wątków i zauważyłem, że "ładniejszy" wątek został zaplanowany z niższym priorytetem. ustalono, że ciąg "high priority ................" jest generowany częściej.

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); 


} 

Odpowiedz

21

pthreads man page mówi:

POSIX.1 wymaga również, aby dzielić Nici szereg innych cech (to cechy te proces szerokości, a nie za gwintem)

[ ...]

  • wartość nice (setpriority (2))

Tak więc, teoretycznie, wartość "niceness" jest globalna dla procesu i współdzielona przez wszystkie wątki, i nie powinieneś być w stanie ustawić konkretnej zależności dla jednego lub więcej pojedynczych wątków.

Jednak ta sama strona człowiek mówi:

LinuxThreads

znaczących cech tej realizacji są następujące:

[...]

  • Wątki nie mają wspólnej, przyjemnej wartości.

NPTL

[...]

NPTL nadal ma kilka niezgodności z POSIX.1:

  • wątki nie podzielają wspólne wartości nice.

Tak więc okazuje się, że obie implementacje gwintowania na Linuksie (LinuxThreads i NPTL) faktycznie naruszają POSIX.1, można ustawić określoną uprzejmość dla jednego lub więcej pojedynczych nici przez przepuszczanie tid do setpriority() na nich systemy.

+1

Ale dlaczego w niektórych implementacjach JVM priorytet wątku java ma odwzorowanie 1: 1 z ładną wartością? //www.javamex.com/tutorials/threads/priority_what.shtml Dodatkowo napisałem aplikację, ustawiając różną wartość różnicy dla różnych wątków i zauważyłem, że ładniejszy wątek został zaplanowany z niższym priorytetem, sprawdzając, jak często dane wyjściowe są. – pierrotlefou

+0

@pierr, co ciekawe, okazuje się, że zarówno NPTL, jak i Linux naruszają POSIX.1. Zaktualizuję moją odpowiedź. –

+0

@ FrédéricHamidi Czy to samo w tym przypadku, że wątki w Linuksie nie mają wspólnej przyjemnej wartości? – blueskin