2013-07-01 6 views
11

Wahnsinnig obskuren Pthread API für Thread Priorität nicht nur unverständlich unverständlich, aber es funktioniert auch nicht nur auf Android.ändern native Thread-Priorität auf Android in C/C++

Also gibt es eine Möglichkeit für mich, die Priorität eines Threads zu reduzieren oder zu erhöhen?

int currentPolicy; 
struct sched_param sched; 
status = pthread_getschedparam(pthread_self(), &currentPolicy, &sched); 
printf("sched.sched_priority:%d currentPolicy:%d", sched.sched_priority, currentPolicy); 
printf("priority min/max:%d/%d", sched_get_priority_min(currentPolicy), sched_get_priority_max(currentPolicy)); 

Ausgänge:

sched.sched_priority: 0 currentPolicy: 0

Priorität min/max: 0/0

auch, egal was ich tue, pthread_setschedparam gib immer einen Fehler für mich zurück (ungültiges Argument). In meinem Code muss ich die Priorität meines Handler-Threads reduzieren, um sicherzustellen, dass der andere Thread mehr CPU-Zeit verbraucht. Alternativ könnte ich die Thread-Priorität meines anderen Threads, den ich verwenden möchte, im Vergleich zu anderen Threads in meinem Prozess erhöhen.

Gibt es eine Möglichkeit für mich, das zu tun? Ich verwende nur nativen C++ - Code.

Bearbeiten: Von diesem Beitrag sieht aus wie Android-Threads sind eine Art von leichten Prozessen und Prioritäten für sie ändern setpriority sollte verwendet werden. Es sieht so aus, dass die Funktion funktioniert (GetPriority vorher und nachher zeigt an, dass die Priorität geändert wurde). Allerdings sehe ich in meiner App keinen erwarteten Effekt.

+0

"* ... pthread_setschedparam gibt immer einen Fehler für mich zurück (ungültiges Argument). *", Würde es Ihnen also etwas ausmachen, uns zu zeigen, was Sie in die Funktion eingegeben haben, damit es 'EINVAL' zurückgibt? – alk

+0

für currentPolicy Ich habe versucht, alle verfügbaren Werte (0, 1, 2, 3) zu übergeben. Für sched.sched_priority habe ich versucht verschiedene Werte einzustellen (-10, 10 usw.). Alle scheitern. – Pavel

Antwort

8

Hier ist einfache Antwort: Verwenden Sie . Es ist in unistd.h erklärt

hier ist der Code der Funktion von Android:

int nice(int increment) 
{ 
    int priority = getpriority(PRIO_PROCESS, 0); 
    return setpriority(PRIO_PROCESS, 0, priority+increment); 
} 

so kann setpriority Thread-Priorität gesetzt werden.

ich Unterschied tatsächlich bekam, wie durch die Verwendung nice(-10) oder nice(10) in meinem Code erwartet

+1

Wo sollte ich diesen Code platzieren? ist es für Threads oder den Prozess? auch, was ist der Rückgabewert? Danke – RonTLV

+0

FWIW sieht so aus, dass dies in '' – nmr

+0

@nmr deklariert ist. Vor 5 Jahren war es vielleicht nicht der Fall – Pavel

7

Android-Threads sind Linux-Threads. Nichts Besonderes an ihnen.

setpriority() ändert den "netten" Wert des Threads, der sich auf die Priorität auswirkt, mit der der Thread geplant wird.

pthread_setschedparam() kann auch verwendet werden, um die Richtlinie zu ändern.

Im Allgemeinen können Sie die Priorität nicht erhöhen oder ihre Richtlinie ohne erhöhte Rechte ändern (CAP_SYS_NICE). Sie können sie senken oder auf "normale" Priorität zurückstellen.

Wenn Sie adb shell ps -t -p verwenden, können Sie die jedem Thread zugewiesenen Prioritäten sehen. Diese Information ist auch in Dalvik Stack Dumps enthalten.

Dalvik verwendet setpriority(), um bei Bedarf vorübergehend die Priorität des GC-Threads zu erhöhen (um eine Prioritätsumkehrung zu vermeiden). Wenn Sie this bit of code um Linie 625 betrachten, können Sie es sehen. Sie können auch den Anruf an set_sched_policy(), eine Android-Bibliothek Funktion sehen, die die cgroup der Thread ändert.

+1

Das ist in der Nähe. 'nice (int)' sollte auf Android verwendet werden, das setpriority verwendet. Alles andere funktioniert einfach nicht. Ich habe auch versucht, den gesamten Android-Quellcode zu durchsuchen, und andere Funktionen werden nicht verwendet. – Pavel

0

Es gibt keine Möglichkeit, die Priorität eines POSIX Thread in Android zu setzen. Die Funktionen nice() und setpriority() konfigurieren die Priorität eines Prozesses, nicht eines einzelnen Threads.

+1

das ist falsch, ich habe es selbst verifiziert. nice & set-priority (default) gelten für den aktuellen Prozess, der in android native world ein linux LWP. Ihre Verwirrung kann dadurch entstehen, dass die Prioritäten von allen gestarteten Threads übernommen werden. Wenn Sie also prio vor dem Start von Child/Worker-Threads setzen, haben alle das prio. – voidStar

+0

Kaufen, das bedeutet nicht, dass Sie die Richtlinie/Priorität eines bestimmten Threads ändern können, nachdem es erstellt/ausgeführt wurde. –

Verwandte Themen