2013-11-21 3 views
0

Я хочу установить приоритет pthread, используя pthread_attr_setschedparam(). Я попытался решить эту проблему, но не мог этого сделать. Я также консультировался с Интернетом, который также использует те же функции. Pthread_create всегда терпит неудачу. Кто-нибудь может мне помочь?Posix threads и priority

Извините за мой английский, я испанский ...

#include <stdio.h> 
#include <pthread.h> 
#include <unistd.h> 
#include <time.h> 
#include <sched.h> 

struct Data{ 
    pthread_mutex_t mutex; 
    int cnt; 
}; 

//VARIABLES GLOBALES 


void *A(void *a) { 
    struct Data* dato = a; 
    int prio = 3; 
    sleep(3); 
    printf("Proceso A [:%d] Inicio\n", prio); 
    pthread_mutex_lock(&dato->mutex); 
    ++dato->cnt; 
    printf("Proceso A. Contador ++\n"); 
    pthread_mutex_unlock(&dato->mutex); 
    printf("Proceso A [%d] Fin\n", prio); 
    return NULL; 
} 

void *M(void *a) { 
    struct Data* dato = a; 
    int prio = 2; 
    printf("Proceso M [%d] Inicio\n", prio); 
    sleep(5); 
    //ESPERA ACTIVA 
    printf("Proceso M. Espera activa: 15 s\n"); 
    time_t fin = time(0) + 15; 
    while (time(0) < fin){ 
     /* esperar activamente */ 
    } 
    //FIN ESPERA ACTIVA 

    printf("Proceso M [%d] Fin\n", prio); 
    return NULL; 
} 

void *B(void *a) { 
    struct Data* dato = a; 
    int prio = 1; 
    sleep(1); 
    printf("Proceso B [%d] Inicio\n", prio); 
    pthread_mutex_lock(&dato->mutex); 
    //ESPERA ACTIVA 
    printf("Proceso B. Espera activa: 7 s\n"); 
    time_t fin = time(0) + 7; 
    while (time(0) < fin){ 
     /* esperar activamente */ 
    } 
    //FIN ESPERA ACTIVA 

    ++dato->cnt; 
    printf("Proceso B. Contador ++\n"); 
    pthread_mutex_unlock(&dato->mutex); 
    printf("Proceso B [%d] Fin\n", prio); 
    return NULL; 
} 

int main(int argc, const char* argv[]) { 
    //crear Mutex 
    printf("Mutex sin atributos especiales\n"); 
    struct Data dato = {PTHREAD_MUTEX_INITIALIZER, 0}; 

    //POLITICA 
    int prio = 10; 
    pthread_attr_t attr; 
    struct sched_param param; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 
    pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); //politica explicita 
    if(pthread_attr_setschedpolicy(&attr, SCHED_FIFO)){    //FIFO 
     printf("Fallo al establecer la politica"); 
    } 
    if (pthread_attr_getschedparam(&attr, &param)) 
     printf ("No puedo obtener los parámetros"); 
    else{ 
     param.sched_priority = prio;         //prioridad 
     if (pthread_attr_setschedparam(&attr, &param)) 
     printf("No puedo cambiar la prioridad"); 
    } 
    //PRIORIDAD MAIN 
    /*pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);*/ 

    //CREACION HEBRAS 
    pthread_t threads[3]; 
    //crear hebra A 
    /*param.sched_priority = 3; 
    pthread_attr_setschedparam(&attr, &param);*/ 
    if (pthread_create(&threads[0], &attr, A, &dato)) printf("Fallo al crear la hebra A\n"); 
    //crear hebra M 
    param.sched_priority = 2; 
    pthread_attr_setschedparam(&attr, &param); 
    if (pthread_create(&threads[1], &attr, M, &dato)) printf("Fallo al crear la hebra M\n"); 
    //crear hebra B 
    param.sched_priority = 1; 
    pthread_attr_setschedparam(&attr, &param); 
    if (pthread_create(&threads[2], &attr, B, &dato)) printf("Fallo al crear la hebra B\n"); 


    //Destruir atributo (liberar recurso) 
    pthread_attr_destroy(&attr); 

    printf("Esperando finalizar\n"); 
    //esperar hebra 1 
    pthread_join(threads[0],NULL); 
    //esperar hebra 2 
    pthread_join(threads[1],NULL); 
    //esperar hebra 3 
    pthread_join(threads[2],NULL); 
    //destruir mutex 
    pthread_mutex_destroy(&dato.mutex); 
    //FIN 
    return 0; 
} 
+0

Какой код ошибки выполняет pthread_create() return? Если вы можете сделать что-то вроде 'int result = pthread_create (...); if (result) printf ("pthread_create() failed:% s \ n", strerror (result)); 'для отображения текстового представления ошибки (вместо номера ошибки, который мы должны были бы искать. ..) –

+0

Код ошибки: «Операция не разрешена»: S –

ответ

2

Из (3) pthread_create

EPERM Нет разрешения, чтобы установить политику планирования и параметры, указанные в ATTR.

Мое предположение, что вы не сработали на pthread_create из-за назначений перед ним. Попробуйте запустить root, если вы хотите изменить расписания. (И проверьте свои коды возврата!)

+0

Спасибо! sudo было решением !! : D –

+0

Вы правы, что ему нужно запускать его как root, но не из-за каких-либо вызовов setchedule. Он пытается изменить приоритет на 10. Приоритет по умолчанию для пользователей в Linux равен 20, и каждый может дать себе худший приоритет, чем тот (более низкий, лучше - хуже). Так что смена его на 21 или 30 будет работать, я предполагаю (но буду _decrease_ приоритет задачи). Если вы хотите улучшить свой приоритет (меньшее число) по сравнению с 20 по умолчанию, вам необходимы повышенные разрешения (т. Е. Root/sudo). –

+0

@Dave Lillethun, это не просто вопрос приоритетов. Вам нужны правильные разрешения для изменения политики планирования. См. [Sched_setscheduler] (http://pubs.opengroup.org/onlinepubs/009695299/functions/sched_setscheduler.html) – Duck

Смежные вопросы