2012-06-04 12 views

Antwort

22

Das Äquivalent zu SetThreadPriority in Linux wäre pthread_setschedprio(pthread_t thread, int priority).

Überprüfen Sie die man page.

EDIT: Hier ist der Beispielcode äquivalent:

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

Diese Probe ist für die Standard-Planungsrichtlinie, die SCHED_OTHER ist.

EDIT: Thread-Attribut muss vor der Verwendung initialisiert werden.

+1

Sie nicht einen Zeiger auf ein uninitialised 'pthread_attr_t' zu' pthread_attr_getschedpolicy() 'passieren kann. – caf

+0

@caf Danke für den Hinweis. Ich habe das Code-Snippet aktualisiert. –

+4

Beachten Sie, dass, obwohl der POSIX-Standard (nach dem Link von der bereitgestellten 'phtread__setschedprio (3)' Handbuchseite zu http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html # tag_02_08_04_01) erwähnt 'pthread_setschedprio (3)' für Threads, die in der 'SCHED_OTHER' Richtlinie laufen, in Linux ist der Wertebereich für den Prioritätswert' [0, 0] 'und macht diese Antwort für Linux unbrauchbar, es sei denn, sie wurde reell verwendet Zeitplanungsklassen ('SCHED_FIFO' oder' SCHED_RR'), die von der Frage nicht aufgerufen werden. – FooF

3

So etwas wie pthread_setschedparam() und Kombination von Politik und Priorität.

Ich denke, Sie würden Richtlinien SCHED_FIFO, SCHED_RR verwenden, wo Sie die Priorität des Threads angeben können.

16

Sie wollen:

#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

Der POSIX-Standard umfasst pthread_setschedparam(3), wie von verschiedenen anderen Antworten erwähnt. Meistens wird diese POSIX-Thread-Bibliotheksfunktion erwähnt, wenn von Echtzeit-Threads gesprochen wird, aber der POSIX-Standard beschränkt seine Verwendung nicht ausschließlich auf die Domäne von Echtzeit-Threads. In Linux ist seine Verwendung jedoch nur dann sinnvoll, wenn die Echtzeit-Scheduling-Klassen SCHED_FIFO oder SCHED_RR verwendet werden, da nur diese Scheduling-Klassen mehr als einen Wert für den Prioritätsparameter zulassen. Sehen Sie dieses stack overflow answer für eine Illustration.

Glücklicherweise oder leider ist es eine Frage der Perspektive, scheint es sowohl Hauptstrom Linux POSIX Thread-Bibliothek Implementierungen (die veralteten LinuxThreads und die aktuelle NPTL-Implementierung) nicht vollständig POSIX-konform, in dem der "nette Wert" ist nicht Prozess spezifische, aber Thread-spezifische Parameter, so scheint es, Sie könnten setpriority(3) verwenden, um die Nettigkeit eines Threads in Linux zu ändern. Dieser Anspruch basiert auf den Kompatibilitätshinweisen in der Handbuchseite pthreads(7) (Suche nach "nettem Wert" auf dieser Seite); Ich habe tatsächlich nicht in der Praxis getestet (einfache Sache zu tun).

Sollten Sie sich dazu entschließen, die POSIX-konforme Methode zum Ändern der Thread-Nice zu verwenden, beachten Sie, dass es die lauernde Möglichkeit gibt, dass jemand die genannte Nichteinhaltung korrigiert. In diesem Fall scheint es keine Möglichkeit zu geben, den Thread zu ändern Priorität in Linux, wenn die normale Scheduling-Klasse verwendet wird (SCHED_OTHER).

0

Für diejenigen, die nach BSD-basierten OS-Lösungen wie MacOS oder iOS suchen, sollten Sie in Erwägung ziehen, die Priorität des Threads bei Bedarf mit mach anstelle des POSIX-Äquivalents festzulegen.

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

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