21

手册页nice说“nice() 将 inc 添加到调用进程的 nice 值中。那么,我们可以使用它来更改由创建的线程的 nice 值pthread_create吗?

编辑:似乎我们可以为每个线程设置好的值。

我编写了一个应用程序,为不同的线程设置了不同的 nice 值,并观察到“更好”的线程已经以较低的优先级调度。检查输出,我发现字符串“高优先级......”的输出频率更高。

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”值对于进程来说是全局的,并且由所有线程共享,您不应该能够为一个或多个单独的线程设置特定的 niceness。

但是,同样的手册页也说:

Linux线程

此实现的显着特点如下:

[...]

  • 线程不共享一个共同的 nice 值。

NPTL

[...]

NPTL 仍然有一些与 POSIX.1 不一致的地方:

  • 线程不共享一个共同的 nice 值。

因此,事实证明,Linux 上的两种线程实现(LinuxThreads 和 NPTL)实际上都违反了 POSIX.1,您可以通过将 a 传递tid给这些系统上的setpriority()来为一个或多个单独的线程设置特定的友好度。

于 2011-10-07T08:37:06.203 回答
0

根据setpriority 的手册页,nice 值越低(nice 值在 to 范围内-2020意味着调度的优先级越高。看起来您的程序按预期工作(nice = -10赋予此线程更高的优先级)。

于 2022-01-24T14:29:45.540 回答