2012-06-04 11 views
12

Dato il seguente bit di codice, mi chiedevo quale sarebbe il bit di codice equivalente in Linux assumendo pthreads o addirittura utilizzando l'API Boost.Thread.Equivalente di SetThreadPriority su Linux (pthreads)

#include <windows.h> 

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

risposta

22

L'equivalente a SetThreadPriority in linux sarebbe pthread_setschedprio(pthread_t thread, int priority).

Verificare il man page.

EDIT: ecco il codice di esempio 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; 
} 

Questo campione è per la politica di scheduling di default che è SCHED_OTHER.

MODIFICA: l'attributo thread deve essere inizializzato prima dell'utilizzo.

+1

Non è possibile passare un puntatore a una 'Non inizializzato pthread_attr_t' a' pthread_attr_getschedpolicy() '. – caf

+0

@caf Grazie per il suggerimento. Ho aggiornato lo snippet di codice. –

+4

Si noti che, sebbene lo standard POSIX (seguendo il collegamento dalla pagina di manuale 'phtread__setschedprio (3)' a http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html # tag_02_08_04_01) menziona usando 'pthread_setschedprio (3)' per i thread in esecuzione nella politica 'SCHED_OTHER', in Linux l'intervallo di valori per il valore di priorità è' [0, 0] 'rendendo questa risposta inutile per Linux, a meno che non venga modificata per l'uso reale classi di pianificazione temporale ('SCHED_FIFO' o' SCHED_RR') che non sono state richiamate dalla domanda. – FooF

3

Qualcosa come pthread_setschedparam() e combinazione di politica e priorità.

Immagino che usereste le politiche SCHED_FIFO, SCHED_RR dove è possibile specificare la priorità del thread.

16

desiderato:

#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

serie La POSIX comprende pthread_setschedparam(3), come detto da varie altre risposte. Per lo più questa funzione della libreria di thread POSIX è menzionata quando si parla di thread in tempo reale, ma lo standard POSIX non limita il suo utilizzo esclusivamente al dominio dei thread in tempo reale. Tuttavia, in Linux il suo uso è davvero significativo solo se si utilizzano le classi di pianificazione in tempo reale SCHED_FIFO o SCHED_RR poiché solo quelle classi di pianificazione consentono più di un valore per il parametro di priorità. Vedi questo stack overflow answer per un'illustrazione.

Per fortuna o purtroppo, è una questione di prospettiva, sembra entrambe le implementazioni flusso principale libreria di thread Linux POSIX (i LinuxThreads obsoleti e l'attuazione NPTL corrente) non sono pienamente conforme a POSIX in quanto il "valore di nice" non è processo parametro specifico ma specifico del thread, quindi sembra che sia possibile utilizzare setpriority(3) per modificare la niceness di un thread in Linux. Questo reclamo si basa sulle note di compatibilità nella pagina di manuale pthreads(7) (cercare "un buon valore" in quella pagina); In realtà non ho provato in pratica (cosa semplice da fare).

Se si decide di utilizzare il modo POSIX di modificare la gradevolezza del thread, si noti che esiste la possibilità in agguato che qualcuno decida di correggere la non conformità menzionata, nel qual caso non sembra esserci alcun modo di cambiare il thread priorità in Linux se si utilizza la normale classe di pianificazione (SCHED_OTHER).

0

Per coloro che sono alla ricerca di soluzioni OS basate su BSD come MacOS o iOS, è consigliabile prendere in considerazione l'impostazione della priorità del thread utilizzando mach invece dell'equivalente POSIX, se necessario.

#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; 
} 

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