21

のマニュアルページにniceは、「nice() は、呼び出し元のプロセスのナイス値に inc を追加します。したがって、それを使用して、によって作成されたスレッドのナイス値を変更できpthread_createますか?

編集: スレッドごとにナイス値を設定できるようです。

スレッドごとに異なるナイス値を設定してアプリケーションを作成したところ、「よりナイスな」スレッドがより低い優先度でスケジュールされていることがわかりました。出力を確認したところ、「high priority .......」という文字列がより頻繁に出力されていることがわかりました。

void * thread_function1(void *arg)
{
  const pid_t tid = syscall(SYS_gettid);

  int ret = setpriority(PRIO_PROCESS, tid, -10);
  printf("tid of high priority thread %d , %d\n", tid ,getpriority(PRIO_PROCESS, tid));
  while(1)
  {
    printf("high priority ................\n");
  }
}


void * thread_function(void *arg)
{
  const pid_t tid = syscall(SYS_gettid);
  int ret = setpriority(PRIO_PROCESS, tid, 10);
  printf("tid of low priority thread %d , %d \n", tid ,getpriority(PRIO_PROCESS, tid));
  while(1)
  {
    printf("lower priority\n");
  }
}


int main()
{
  pthread_t id1;
  pthread_t id2;

  pid_t pid = getpid();
  pid_t tid = syscall(SYS_gettid);

  printf("main thread : pid = %d , tid = %d \n" , pid, tid);
  pthread_create(&id1, NULL, thread_function1,  NULL);
  pthread_create(&id2, NULL,thread_function,   NULL);

  pthread_join(id1, NULL);
  pthread_join(id2, NULL);
}
4

2 に答える 2

32

pthreads のマニュアルページには次のように書かれています。

POSIX.1 では、スレッドが他のさまざまな属性を共有することも必要です (つまり、これらの属性はスレッドごとではなくプロセス全体に適用されます)。

[...]

  • いい値 ( setpriority(2) )

したがって、理論的には、「niceness」値はプロセスに対してグローバルであり、すべてのスレッドで共有されるため、1 つ以上の個々のスレッドに対して特定の niceness を設定することはできません。

ただし、まったく同じマニュアルページにも次のように記載されています。

Linuxスレッド

この実装の注目すべき機能は次のとおりです。

[...]

  • スレッドは共通のナイス値を共有しません。

NPTL

[...]

NPTL にはまだ POSIX.1 との不適合がいくつかあります。

  • スレッドは共通のナイス値を共有しません。

したがって、Linux でのスレッド化の実装 (LinuxThreads と NPTL) の両方が実際には POSIX.1 に違反していることがわかり、これらのシステムでsetpriority()tidに aを渡すことで、1 つまたは複数の個々のスレッドに特定のナイスネスを設定できます。

于 2011-10-07T08:37:06.203 に答える
0

setpriority のマニュアル ページによると、 nice 値が小さいほど (nice 値は ~ の範囲にあります-20) 20、スケジューリングの優先順位が高くなります。プログラムが期待どおりに動作しているようです (nice = -10このスレッドの優先度が高くなります)。

于 2022-01-24T14:29:45.540 に答える