2012-06-04 12 views

Odpowiedz

22

Odpowiednikiem SetThreadPriority w systemie Linux będzie pthread_setschedprio(pthread_t thread, int priority).

Sprawdź man page.

EDIT: tutaj jest równoznaczne przykładowy kod:

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

Ta próbka jest dla domyślnej polityki planowania, który jest SCHED_OTHER.

EDYCJA: atrybut wątku musi zostać zainicjowany przed użyciem.

+1

Nie można przekazać wskaźnik do zainicjalizowana 'pthread_attr_t' do' pthread_attr_getschedpolicy() '. – caf

+0

@ ca Dzięki za podpowiedź. Zaktualizowałem fragment kodu. –

+4

Należy pamiętać, że chociaż standard POSIX (po odsyłaczu z podanej strony podręcznika 'phtread__setschedprio (3)' do http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html # tag_02_08_04_01) wspomina o użyciu 'pthread_setschedprio (3)' dla wątków działających w strategii 'SCHED_OTHER', w Linuksie zakres wartości dla wartości priorytetu wynosi' [0, 0] 'czyniąc tę ​​odpowiedź bezużyteczną dla Linuksa, chyba że zostanie zmieniona na rzeczywistą klasy harmonogramów czasowych ('SCHED_FIFO' lub' SCHED_RR'), które nie są zadawane przez pytanie. – FooF

3

Coś jak pthread_setschedparam() oraz połączenie polityki i priorytetu.

Domyślam się, że używałbyś polityk SCHED_FIFO, SCHED_RR, gdzie możesz określić priorytet wątku.

16

Chcecie:

#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

standardem POSIX obejmuje pthread_setschedparam(3), jak wspomniano przez różne odpowiedzi. Najczęściej ta funkcja biblioteki wątków POSIX jest wymieniona podczas rozmowy o wątkach w czasie rzeczywistym, ale standard POSIX nie ogranicza wykorzystania wyłącznie do dziedziny wątków czasu rzeczywistego. Jednak w Linuksie jego użycie jest naprawdę znaczące tylko wtedy, gdy używa się klas planowania w czasie rzeczywistym SCHED_FIFO lub SCHED_RR, ponieważ tylko te klasy planowania dopuszczają więcej niż jedną wartość dla parametru priorytetu. Zobacz tę ilustrację na stronie stack overflow answer.

Na szczęście lub niestety jest to kwestia perspektywy, wydaje się, że zarówno główne strumienie Linux biblioteki POSIX implementacje wątków (przestarzałe LinuxThreads i obecna implementacja NPTL) nie są w pełni zgodne z POSIX, że "nice value" nie jest procesem specyficzny, ale specyficzny dla wątku parametr, więc wydaje się, że można użyć setpriority(3), aby zmienić adres wątku w systemie Linux. To roszczenie opiera się na uwagach dotyczących zgodności na stronie podręcznika pthreads(7) (wyszukaj "niezłą wartość" na tej stronie); W rzeczywistości nie testowałem w praktyce (proste rzeczy do zrobienia).

Jeśli zdecydujesz się na użycie niezgodnego ze standardami POSIX sposobu zmiany nićmi wątku, zauważ, że istnieje możliwość, że ktoś zdecyduje się naprawić wspomniane niezgodności, w którym to przypadku wydaje się, że nie ma możliwości zmiany nici priorytet w Linuksie, jeśli używasz normalnej klasy planowania (SCHED_OTHER).

0

Dla tych, którzy mogą poszukiwać rozwiązań opartych na BSD, takich jak MacOS lub iOS, możesz rozważyć ustawienie priorytetu wątku za pomocą mach zamiast w razie potrzeby odpowiednika POSIX.

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

Źródło: https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html