c-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]  Inicion", prio); 
    pthread_mutex_lock( &dato->mutex );
    ++dato->cnt;
    printf("Proceso A. Contador ++n");
    pthread_mutex_unlock( &dato->mutex );
    printf("Proceso A [%d] Finn", prio);
    return NULL;
}  
void *M(void *a) {
    struct Data* dato = a;
    int prio = 2;
    printf("Proceso M [%d] Inicion", prio); 
    sleep(5);
    //ESPERA ACTIVA
    printf("Proceso M. Espera activa: 15 sn");
    time_t fin = time(0) + 15;
    while (time(0) < fin){
        /* esperar activamente */ 
    }
    //FIN ESPERA ACTIVA
    printf("Proceso M [%d] Finn", prio);
    return NULL;
}
void *B(void *a) {
    struct Data* dato = a;
    int prio = 1;
    sleep(1);
    printf("Proceso B [%d] Inicion", prio); 
    pthread_mutex_lock( &dato->mutex);
    //ESPERA ACTIVA
    printf("Proceso B. Espera activa: 7 sn");
    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] Finn", prio);
    return NULL;
}
int main(int argc, const char* argv[]) {
    //crear Mutex
    printf("Mutex sin atributos especialesn"); 
    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 An");
    //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 Mn");
    //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 Bn");

    //Destruir atributo (liberar recurso)
    pthread_attr_destroy(&attr);
    printf("Esperando finalizarn");
    //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;
} 

从(3)pthread_create

EPERM没有设置属性中指定的调度策略和参数的权限。

我猜你在pthread_create上失败了,因为它之前有setschedule调用。如果你想更改计划,请尝试以root身份运行。(并检查您的返回代码!)

最新更新