我想使用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, ¶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 An");
//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 Mn");
//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 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身份运行。(并检查您的返回代码!)