4

関数を呼び出した後pthread_create、次のメッセージを受け取ります。

W/libc (26409): pthread_create sched_setscheduler 呼び出しが失敗しました: 操作は許可されていません

スレッドの作成に使用されるコードは次のとおりです。

pthread_attr_t threadAttr;
int ret = pthread_attr_init(&threadAttr);
//code to check ret - it's 0

size_t guard_size = 0;
pthread_attr_getguardsize(&threadAttr, &guard_size);
ret = pthread_attr_setstacksize(&threadAttr, myStackSize + guard_size);
//code to check ret - it's 0

ret = pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED);
//code to check ret - it's 0

ret = pthread_attr_setschedpolicy(&threadAttr, SCHED_FIFO);
//code to check ret - it's 0

sched_param  schedParam;
schedParam.sched_priority = myPriority; //it's 16
ret = pthread_attr_setschedparam(&threadAttr, &schedParam);
//code to check ret - it's 0

// Create the thread
ret = pthread_create(&myHandle, &threadAttr, RunCallback, (void *)myData);
//code to check ret - it's 0
//code to check myHandle - it's > 0

// Delete attribute
pthread_attr_destroy(&threadAttr);

メッセージは、RunCallback のブレークポイントに到達する前に logcat に表示されることに注意してください。

なぜ私がこの警告を持っているのか知っていますか? それを無視しても安全ですか?

PS: コードは、4.4.2 OS バージョン (ビルド番号 KOT49H) の Nexus 4 デバイスでネイティブ アクティビティとして実行されます。

4

2 に答える 2

7

を呼び出すとpthread_attr_setschedpolicy、特定のスケジューリング ポリシーを設定するように要求されます ( http://man7.org/linux/man-pages/man3/pthread_attr_setschedpolicy.3.html )。設定しているポリシーは、 http://man7.org/linux/man-pages/man2/sched_setscheduler.2.htmlSCHED_FIFOによるリアルタイム ポリシーです。スケジューリング ポリシーをリアルタイム ポリシーに設定するには、http://man7.org/linux/man-pages/man7/capabilities.7.htmlに従って機能が必要です。したがって、その機能がない限り、呼び出しは失敗します。CAP_SYS_NICEpthread_attr_setschedpolicy

この問題を解決するには、スケジューラー属性を削除する (そしてデフォルトのスケジューリングを使用する) か、プロセスが適切な機能で開始されるようにします (たとえば、root としてプロセスを開始し、 以外のすべての権限を削除するなどCAP_SYS_NICE)。

于 2014-01-13T15:53:23.127 に答える
2

このエラーは、スレッドを作成しようとしているプロセスに、指定されたスケジューリングの優先度を設定するための適切な権限がないことを意味します。

この警告を無視できるかどうかは、プログラムとそのシステムへの統合が、システムの関連するプログラム/モジュール/コンポーネントに設定されたスケジューリングの優先順位にどのように依存するかに大きく依存します。

スケジューリングの優先度を設定する方法の詳細については、こちらをお読みください

于 2014-01-13T15:52:52.640 に答える