Reputation: 117
I want to set pthread priority using pthread_attr_setschedparam(). I have tried to resolve this issue but couldn't do it. I also consulted internet which also uses the same functions. Pthread_create always fail. Can someone help me?
Sorry for my english, i'm spanish...
#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, ¶m))
printf ("No puedo obtener los parámetros");
else{
param.sched_priority = prio; //prioridad
if (pthread_attr_setschedparam(&attr, ¶m))
printf("No puedo cambiar la prioridad");
}
//PRIORIDAD MAIN
/*pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);*/
//CREACION HEBRAS
pthread_t threads[3];
//crear hebra A
/*param.sched_priority = 3;
pthread_attr_setschedparam(&attr, ¶m);*/
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, ¶m);
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, ¶m);
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;
}
Upvotes: 0
Views: 980
Reputation: 27542
From (3) pthread_create
EPERM No permission to set the scheduling policy and parameters specified in attr.
My guess is you are failing on the pthread_create
because of the setschedule calls before it. Try running as root if you want to change schedules. (And check your return codes!)
Upvotes: 2