6

シングルスレッドのアプリケーションがあります。以下のコードを使用すると、が得られsched_setscheduler(): Operation not permitted ます。

struct sched_param param;
param.sched_priority = 1;
if (sched_setscheduler(getpid(), SCHED_RR, &param))
printf(stderr, "sched_setscheduler(): %s\n", strerror(errno));

しかし、以下のようなpthread apiを使用しても、エラーは発生しません。シングルスレッドアプリケーションの2つの違いは何ですか?以下の関数は実際にスケジューラと優先度を変更しますか、それともエラー処理がありませんか?

void assignRRPriority(int tPriority)
{
    int  policy;
    struct sched_param param;

    pthread_getschedparam(pthread_self(), &policy, &param);
    param.sched_priority = tPriority;
    if(pthread_setschedparam(pthread_self(), SCHED_RR, &param))
            printf("error while setting thread priority to %d", tPriority);
}
4

2 に答える 2

3

このエラーは、リアルタイム優先度に設定された制限が原因である可能性があります (ulimit -rチェックulimit -r 99して、1 ~ 99 の優先度を許可します)。成功した時点でpthread_setschedparam: オプションなしでコンパイルした-pthread場合、この関数は他の pthread 関数と同様に単なるスタブです。-pthreadオプションを使用すると、結果は同じになります (同じstraceシステム コールが使用されていることを示しています)。

于 2013-01-05T21:04:12.893 に答える
0

基本的なエラー処理が欠けています。そこにいくつかの < が必要です。これを試して:

if(pthread_setschedparam(pthread_self(), SCHED_RR, &param) < 0) {
  perror("pthread_setschedparam");
}
于 2013-01-05T21:04:36.047 に答える