2012-12-20 14 views
6

Non riesco a impostare la priorità Pthread utilizzando pthread_attr_setschedparam(). Ho provato a risolvere questo problema ma non sono riuscito a farlo. Ho anche consultato il mio libro di testo che utilizza anche la stessa funzione. Ho copiato questo codice dal libro. Puoi dirmi come impostare la priorità del thread?Impossibile impostare Pthread Priority

Ecco il codice:

void *Func(void *arg); 
int main() 
{ 
pthread_t tid[5]; 

pthread_attr_t *tattr; 
struct sched_param param; 
int pr,error,i; 

do 
{ 
if((tattr=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)))==NULL) 
{ 
    printf("Couldn't allocate memory for attribute object\n"); 
} 
}while(tattr==NULL); 

if(error=pthread_attr_init(tattr)) 
{ 
    fprintf(stderr,"Attribute initialization failed with error %s\n",strerror(error)); 
} 

for(i=0;i<5;i++) 
{ 
    //scanf("%d",&pr); 
     error = pthread_attr_getschedparam(tattr,&param); 

     if(error!=0) 
     { 
      printf("failed to get priority\n"); 
     } 

     param.sched_priority=10; 
     error=pthread_attr_setschedparam(tattr,&param); 

     if(error!=0) 
     { 
      printf("failed to set priority\n"); 
     } 
/* 
    if(i%2==0) 
    { 
     if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_DETACHED)) 

     { 
      fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error)); 
     } 
    } 
    else 
     if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_JOINABLE)) 
     { 
      fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error)); 
     } 
*/  
     pthread_create(&tid[i],tattr,Func,NULL); 


     printf("waiting for thread %d\n",i); 
} 

free(tattr);// release dynamically allocated memory 

printf("All threads terminated\n"); 
return 0; 
} 

void *Func(void *arg) 
{ 
printf("inside\n"); 

pthread_attr_t *tattr=(pthread_attr_t *)arg; 
int state,error; 

struct sched_param param; 

error=pthread_attr_getdetachstate(tattr,&state); 

if(error==0 && state==PTHREAD_CREATE_DETACHED) 
{ 
    printf(" My state is DETACHED\n"); 
} 
else 
    if(error==0 && state==PTHREAD_CREATE_JOINABLE) 
    { 
     printf(" My state is JOINABLE\n"); 
    } 

error=pthread_attr_getschedpolicy(tattr,&param); 

if(error==0) 
{ 
    printf(" My Priority is %d\n",param.sched_priority); 
} 

return NULL; 
} 
+0

Che risultato vuoi arrivare? Come sai che non funziona? – Celada

+0

Stampo 'impossibile ottenere la priorità' per verificare se la priorità del thread è impostata o meno. e viene sempre stampato, il che significa che la priorità non è impostata. – Alfred

+1

Sei in esecuzione come utente root? Solo root può aumentare la priorità (riduci il valore bello) – anishsane

risposta

4

tuo pthread_attr_setschedparam chiamata sta venendo a mancare con "parametro non valido". Il programma inizierà con la politica di pianificazione linux predefinita di SCHED_OTHER. Non è possibile modificare la priorità di SCHED_OTHER.

Da uomo (2) sched_setscheduler:

SCHED_OTHER può essere utilizzato solo a priorità statica 0. SCHED_OTHER è il standard di Linux scheduler time-sharing che è destinato a tutti i processi che non richiedono priorità statica speciale meccanismi in tempo reale.

Se si modifica la politica dell'attributo pthread in un altro tipo di pianificazione prima di tentare di modificare la priorità, il programma funzionerà. Qualcosa di simile

for (i = 0;i < 5;i++) 
{ 
    policy = SCHED_RR; 

    error = pthread_attr_setschedpolicy(tattr, policy); 

    // insert error handling 

    error = pthread_attr_getschedparam(tattr, &param); 

    // insert error handling 

    // yada yada yada ... 
} 
+0

Inserisci anche un 'pthread_exit' in main e/o' pthread_join' i thread appropriati quando elimini il codice detached/join. – Duck

0
I created thread in main and set attributes using  
pthread_attr_setechedparam(...) .Once the child thread is up and running  i want to check this thread priority and policy set before using 
pthread_getschedparam(, ,). I executed code sudo still it is printing  zero for both pri and policy. Please find the code below. 
#include "stdio.h" 

#include "stdlib.h" 

#include "pthread.h" 

void *Func(void *arg); 
int main() 
{ 

pthread_t tid; 

pthread_attr_t *tattr; 

struct sched_param param; 

int pr,error,i; 

int pol; 
do 

    { 

if((tattr=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)))==NULL) 

{ 

    printf("Couldn't allocate memory for attribute object\n"); 
    } 


}while(tattr==NULL); 

    if(error=pthread_attr_init(tattr)) 
{ 
    fprintf(stderr,"Attribute initialization failed with error %s\n",strerror(error)); 
    } 

//for(i=0;i<5;i++) 
    //{ 
    error = pthread_attr_getschedparam(tattr,&param); 

    if(error!=0) 
    { 
     printf("failed to get priority\n"); 
    } 

    int policy=1; 
    error=pthread_attr_setschedpolicy(tattr,policy); 
    if(error!=0) 
    { 
     printf("failed to set priority\n"); 
    } 

    param.sched_priority=10; 
    error=pthread_attr_setschedparam(tattr,&param); 

    if(error!=0) 
    { 
     printf("failed to set priority\n"); 
    } 

    pthread_create(&tid,tattr,Func,NULL); 

    pthread_getschedparam(tid,&pol,&param); 
    printf("policy:: %d pri :: %d\n",pol,param.sched_priority); 

    printf("waiting for thread %d\n",i); 

    pthread_join(tid,NULL); 
    free(tattr);// release dynamically allocated memory 

    printf("All threads terminated\n"); 
    return 0; 
    } 

    void *Func(void *arg) 
    { 
    printf("inside\n"); 
    int policy,err=0; 
    struct sched_param p; 
    err=pthread_getschedparam(pthread_self(),&policy,&p); 
    if(err!=0) 
    { 
    printf("error\n"); 
    } 
    printf("the priorty= %d policy =%d\n",p.sched_priority,policy); 

    } 
0

Questa implementazione ha funzionato per me (con questo post di aiuto), è semplice:

pthread_t myThread; 
pthread_attr_t *tattr; 
struct sched_param param; 
int error,policy, prio; 

prio = 10; 

tattr = (pthread_attr_t *)malloc(sizeof(pthread_attr_t)); 
error = pthread_attr_init(tattr); 
cout << "init: " << error << endl; 

error = pthread_attr_getschedparam(tattr,&param); 
cout << "getschedparam: " << error << endl; 

error = pthread_attr_setinheritsched(tattr, PTHREAD_EXPLICIT_SCHED); 
cout << "setinheritsched: " << error << endl; 

policy = SCHED_RR; 
error = pthread_attr_setschedpolicy(tattr, policy); 
cout << "setschedpolicy = " << policy << ": " << error << endl; 

param.sched_priority = prio; 
error = pthread_attr_setschedparam(tattr ,&param); 
cout << "setschedparam: " << error << endl; 

error = pthread_create(&myThread,tattr,threadFunc,&numOfExecutions); 
cout << "create: " << error << endl; 

pthread_getschedparam(myThread,&policy,&param); 
printf("policy:: %d pri :: %d\n",policy,param.sched_priority); 

È possibile trovare il mio codice di lavoro here