gpt4 book ai didi

c - Posix 线程和优先级

转载 作者:太空宇宙 更新时间:2023-11-04 08:49:42 26 4
gpt4 key购买 nike

我想使用 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 No permission to set the scheduling policy and parameters specified in attr.

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

关于c - Posix 线程和优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com