Posix线程和优先级

时间:2013-11-21 01:12:08

标签: c pthreads posix

我想使用pthread_attr_setschedparam()设置pthread优先级。我试图解决这个问题,但无法解决。我也咨询了互联网,它也使用相同的功能。 Pthread_create总是失败。有人能帮助我吗?

对不起我的英语,我是西班牙人......

#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;
} 

1 个答案:

答案 0 :(得分:2)

来自(3)pthread_create

  

EPERM无权设置attr。

中指定的调度策略和参数

我的猜测是你在pthread_create失败了,因为它之前的setschedule调用。如果要更改计划,请尝试以root用户身份运行。 (并检查您的退货代码!)