2012-06-04 14 views
12

Dado el siguiente bit de código, me preguntaba cuál sería el bit de código equivalente en Linux suponiendo pthreads o incluso usando la API Boost.Thread.Equivalente a SetThreadPriority en Linux (pthreads)

#include <windows.h> 

int main() 
{ 
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); 
    return 0; 
} 

Respuesta

22

El equivalente a SetThreadPriority en Linux sería pthread_setschedprio(pthread_t thread, int priority).

Compruebe el man page.

EDIT: Aquí está el código de muestra equivalente:

#include <pthread.h> 

int main() 
{ 
    pthread_t thId = pthread_self(); 
    pthread_attr_t thAttr; 
    int policy = 0; 
    int max_prio_for_policy = 0; 

    pthread_attr_init(&thAttr); 
    pthread_attr_getschedpolicy(&thAttr, &policy); 
    max_prio_for_policy = sched_get_priority_max(policy); 


    pthread_setschedprio(thId, max_prio_for_policy); 
    pthread_attr_destroy(&thAttr); 

    return 0; 
} 

Este ejemplo es para la política de planificación por defecto que es SCHED_OTHER.

EDITAR: el atributo de hilo debe inicializarse antes del uso.

+1

No se puede pasar un puntero a un '' pthread_attr_t' no inicializado a pthread_attr_getschedpolicy() '. – caf

+0

@caf Gracias por la pista. He actualizado el fragmento de código. –

+4

Tenga en cuenta que, aunque el estándar POSIX (siguiendo el enlace de la página de manual 'phtread__setschedprio (3)' proporcionada a http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html # tag_02_08_04_01) menciona 'pthread_setschedprio (3)' para hilos que se ejecutan en la política 'SCHED_OTHER', en Linux el rango de valores para el valor de prioridad es' [0, 0] 'haciendo que esta respuesta sea inútil para Linux, a menos que se cambie para usar las clases de programación de tiempo ('SCHED_FIFO' o' SCHED_RR') que no son llamadas por la pregunta. – FooF

3

Algo así como pthread_setschedparam() y la combinación de la política y la prioridad.

Supongo que usaría las políticas SCHED_FIFO, SCHED_RR donde puede especificar la prioridad del hilo.

16

que desee:

#include <pthread.h> 

int main() 
{ 
    int policy; 
    struct sched_param param; 

    pthread_getschedparam(pthread_self(), &policy, &param); 
    param.sched_priority = sched_get_priority_max(policy); 
    pthread_setschedparam(pthread_self(), policy, &param); 

    return 0; 
} 
5

estándar POSIX El pthread_setschedparam(3) incluye, como se ha mencionado por varias otras respuestas. En su mayoría, esta función de biblioteca de subprocesos POSIX se menciona cuando se habla de subprocesos en tiempo real, pero el estándar POSIX no limita su uso únicamente al dominio de subprocesos en tiempo real. Sin embargo, en Linux, su uso solo tiene sentido si se usan las clases de programación en tiempo real SCHED_FIFO o SCHED_RR, ya que solo esas clases de programación permiten más de un valor para el parámetro de prioridad. Vea esto stack overflow answer para una ilustración. Afortunada o desafortunadamente, es una cuestión de perspectiva, parece que las implementaciones de la biblioteca de hilos POSIX de Linux (las LinuxThreads obsoletas y la implementación actual de NPTL) no son completamente compatibles con POSIX porque el "buen valor" no es procesado parámetro específico pero específico del subproceso, por lo que parece que podría usar setpriority(3) para cambiar la bondad de un hilo en Linux. Este reclamo se basa en las notas de compatibilidad en la página del manual pthreads(7) (busque "buen valor" en esa página); En realidad, no he probado en la práctica (cosa sencilla que hacer).

En caso de que decida usar la forma incorrecta de POSIX de cambiar la amabilidad del hilo, tenga en cuenta que existe la posibilidad de que alguien decida corregir el incumplimiento mencionado, en cuyo caso parece que no hay forma de cambiar el hilo prioridad en Linux si usa una clase de programación normal (SCHED_OTHER).

0

Para aquellos que estén buscando soluciones de SO basadas en BSD como MacOS o iOS, puede considerar establecer la prioridad del subproceso usando mach en lugar del equivalente de POSIX si es necesario.

#include <mach/mach_init.h> 
#include <mach/thread_policy.h> 
#include <mach/sched.h> 
#include <pthread.h> 

int set_realtime(int period, int computation, int constraint) { 
    struct thread_time_constraint_policy ttcpolicy; 
    int ret; 
    thread_port_t threadport = pthread_mach_thread_np(pthread_self()); 

    ttcpolicy.period=period; // HZ/160 
    ttcpolicy.computation=computation; // HZ/3300; 
    ttcpolicy.constraint=constraint; // HZ/2200; 
    ttcpolicy.preemptible=1; 

    if ((ret=thread_policy_set(threadport, 
     THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t)&ttcpolicy, 
     THREAD_TIME_CONSTRAINT_POLICY_COUNT)) != KERN_SUCCESS) { 
      fprintf(stderr, "set_realtime() failed.\n"); 
      return 0; 
    } 
    return 1; 
} 

Fuente: https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html