2013-07-01 35 views
11

スレッド優先度のあいまいなpthread apiは、奇妙なことには理解できないだけでなく、アンドロイドでは機能しません。c/C++での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は優先度が変更されたことを示します)。しかし、私は私のアプリで期待された効果が表示されません。

+0

"* ... pthread_setschedparamは常に私のためにエラーを返します(引数が無効です)。" "なので、あなたが関数に渡したものが' EINVAL'を返すように見せてもらえますか? – alk

+0

for currentPolicy利用可能なすべての値(0,1,2,3)を渡そうとしました。 sched.sched_priorityについては、私は別の値(-10,10など)を設定しようとしました。すべて失敗します。 – Pavel

答えて

8

ここでは簡単な答えです:int nice(int increment)を使用してください。ここでのAndroidから関数のコードですunistd.h

で宣言されています:

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

ので、setpriorityは、スレッドの優先順位を設定するために使用することができます。

アンドロイドでPOSIXスレッドの優先順位を設定する方法はありませんnice(-10)またはnice(10)

+1

このコードはどこに置く必要がありますか?スレッドやプロセスのためですか?また、戻り値は何ですか?ありがとう – RonTLV

+0

FWIWは '' – nmr

+0

@nmrで宣言されているように見えます.5年前はそれが当てはまらなかったかもしれません – Pavel

7

AndroidスレッドはLinuxスレッドです。特別なものはありません。

setpriority()は、スレッドの優先順位に影響を与えるスレッドの「nice」値を変更します。

pthread_setschedparam()ポリシーも変更することができます。

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

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

Dalvikは、setpriority()を使用して、GCスレッドの優先度を必要に応じて一時的に上げます(優先度の逆転を避けるため)。あなたがライン625の周りにthis bit of codeを見るなら、あなたはそれを見ることができます。また、set_sched_policy()の呼び出しを見ることができます。これは、cgroupのスレッドが入っているAndroidライブラリ関数です。

+1

これで終わりです。 setpriorityを使うアンドロイドで 'nice(int)'を使うべきです。他のすべてはうまくいきません。私はまた、アンドロイドのソースコード全体を検索しようとし、他の機能は使用されていません。 – Pavel

0

を使って自分のコードで期待どおりに私が実際に違いを得ました。 nice()setpriority()関数は、単一のスレッドではなく、プロセスの優先度を設定します。

+1

それは間違っています。 nice&set-priority(デフォルト)は、現在のプロセスに適用され、アンドロイドのネイティブ世界では、Linux LWPに適用されます。あなたの混乱は、すべての開始スレッドによって優先順位が内在しているという事実から生じるかもしれません。子/ワーカースレッドを起動する前にprioを設定すると、すべてがそのprioを持ちます。 – voidStar

+0

購入とは、作成/実行後の特定のスレッドのポリシー/優先度を変更できるわけではありません。 –

関連する問題