簡體   English   中英

Posix線程和優先級

[英]Posix threads and priority

我想使用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;
} 

來自(3)pthread_create

EPERM無權設置attr中指定的調度策略和參數。

我猜你是因為在它之前的setschedule調用而在pthread_create上失敗了。 如果要更改計划,請嘗試以root用戶身份運行。 (並查看您的退貨代碼!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM