15

スレッド優先度のための非常にあいまいな pthread api は、非常に理解できないだけでなく、android では機能しません。

それで、スレッドの優先度を下げたり上げたりする方法はありますか?

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));

出力:

sched.sched_priority:0 currentPolicy:0

優先度の最小/最大:0/0

また、何をしても、 pthread_setschedparam は常にエラーを返します (無効な引数)。私のコードでは、ハンドラー スレッドの優先順位を下げて、他のスレッドがより多くの CPU 時間を使用するようにする必要があります。または、代わりに、プロセス内の他のスレッドと比較して、より多くの CPU として使用したい他のスレッドのスレッド優先度を上げることもできます。

それを行う方法はありますか?ネイティブの C++ コードのみを使用します。

編集:この投稿から、アンドロイドのスレッドはある種の軽量プロセスであり、それらの優先度を変更するにはsetpriorityを使用する必要があるようです。関数が機能しているように見えます (前後の getpriority は優先度が変更されたことを示します)。ただし、アプリで期待される効果が見られません。

4

3 に答える 3

10

Android スレッドは Linux スレッドです。それらについて特別なことは何もありません。

setpriority()スレッドの「nice」値を変更します。これは、スレッドがスケジュールされる優先度に影響します。

pthread_setschedparam()ポリシーの変更にも使用できます。

一般的に言えば、特権を昇格させないと、優先度を上げたり、ポリシーを変更したりすることはできません ( CAP_SYS_NICE)。下げるか、「通常の」優先度に戻すことができます。

使用adb shell ps -t -pすると、すべてのスレッドに割り当てられた優先度を確認できます。この情報は、Dalvik スタック ダンプにも含まれています。

Dalvik はsetpriority()、必要に応じて GC スレッドの優先度を一時的に上げるために使用します (優先度の逆転を避けるため)。このコードの625 行付近を見ると、それがわかります。スレッドが属する cgroupset_sched_policy()を変更する Android ライブラリ関数の呼び出しも確認できます。

于 2013-07-01T18:17:02.617 に答える
10

簡単な答えは次のとおりint nice(int increment)です。unistd.h で宣言されています

Android の関数のコードは次のとおりです。

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

そのため、setpriorityスレッドの優先度を設定するために使用できます。

nice(-10)またはを使用して、コードで実際に期待どおりの違いを得ましたnice(10)

于 2013-07-01T20:00:13.543 に答える