2013-01-05 2 views
6

Ho un'applicazione a thread singolo. Se io uso sotto il codice, ottengo sched_setscheduler(): Operation not permitted .modifica priorità thread e scheduler in linux

struct sched_param param; 
param.sched_priority = 1; 
if (sched_setscheduler(getpid(), SCHED_RR, &param)) 
printf(stderr, "sched_setscheduler(): %s\n", strerror(errno)); 

Ma, se uso pthread api come di seguito, non ottengo un errore. Qual è la differenza tra i due per un'applicazione a thread singolo e la funzione di sotto sta cambiando davvero lo scheduler e la priorità o mi manca qualche gestione degli errori?

void assignRRPriority(int tPriority) 
{ 
    int policy; 
    struct sched_param param; 

    pthread_getschedparam(pthread_self(), &policy, &param); 
    param.sched_priority = tPriority; 
    if(pthread_setschedparam(pthread_self(), SCHED_RR, &param)) 
      printf("error while setting thread priority to %d", tPriority); 
} 

risposta

3

L'errore può essere causato da un limite massimo di priorità in tempo reale (ulimit -r per verificare, ulimit -r 99 per consentire 1-99 priorità). A partire da pthread_setschedparam successo: se si è compilato senza l'opzione -pthread, questa funzione è solo uno stub, come alcune altre funzioni di pthread. Con l'opzione -pthread, i risultati devono essere identici (strace indica che viene utilizzata la stessa chiamata di sistema).

+0

1. Ho collegato l'applicazione con -lpthread. 2. ulimit -r mostra 0. quindi come spiega che sono in grado di chiamare la funzione assignRRPriority con il valore di 80. Perché non si verifica un errore? – Jimm

+0

'-lpthread' non è sufficiente,' -pthread' è richiesto (per _both_ compiling _and_ linking). Quindi assegnareRRPriority fallirà. –

0

Manca una gestione di base degli errori. Hai bisogno di un po 'di < lì. Prova questo:

if(pthread_setschedparam(pthread_self(), SCHED_RR, &param) < 0) { 
    perror("pthread_setschedparam"); 
}