【问题标题】:Posix threads and priorityPosix 线程和优先级
【发布时间】:2013-11-24 05:07:36
【问题描述】:

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

【问题讨论】:

  • pthread_create() 返回什么错误代码?如果可以的话,请执行int result = pthread_create(...); if (result) printf("pthread_create() failed: %s\n", strerror(result)); 之类的操作来显示错误的文本表示(而不仅仅是错误号,然后我们必须查找...)
  • 错误代码是“不允许操作”:S

标签: c pthreads posix


【解决方案1】:

来自 (3) pthread_create

EPERM 无权设置 attr 中指定的调度策略和参数。

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

【讨论】:

  • 谢谢!! sudo 是解决方案! :D
  • 您是正确的,他需要以 root 身份运行,但不是因为任何 setschedule 调用。他试图将优先级更改为 10。Linux 上用户的默认优先级是 20,任何人都可以给自己比这更差的优先级(越低越好;越大越差)。所以将其更改为 21 或 30 会起作用,我猜(但会降低任务的优先级)。如果您想与用户默认的 20 相比提高您的优先级(较低的数字),您需要提升权限(即 root/sudo)。
  • @Dave Lillethun,这不仅仅是优先级问题。您需要适当的权限才能更改调度策略。见sched_setscheduler
  • @Duck 我对静态优先级和动态优先级感到困惑。我说的是动态优先级(AKA,“nice”值),但 OP 正在做的是静态优先级。所以我离开了那个……但我会把评论留给未来的读者;请注意,我上面的评论指的是“不错”的价值观,而不是 OP 正在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2012-11-17
  • 2016-06-03
相关资源
最近更新 更多