c++ setpriority()不改变线程的优先级

izkcnapc  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(310)

我看了其他关于这个问题的问题/答案,但没有一个解决了我的问题。
我的线程有默认的调度策略SCHED_OTHER,优先级为0,所以没有优先级,也就是说,你不能用(sched_param)param.sched_priority来改变优先级。
1.因此,这意味着排除了使用系统调用pthread_setschedparam。

  1. pthread_setschedprio(std::thread::native_handle(),-1)-这不会影响线程的优先级。我使用getpriority(PRIO_PROCESS,tid)进行了验证。我们可以使用pthread_setschedprio()作为默认调度器吗?
    仔细阅读this页面后,我了解到需要通过调整nice值来更改线程的动态优先级,这可以通过以下任一方法实现:
  • 尼斯(19);
  • 我试过了,没有任何效果。我希望这是一个过程范围内的好的价值观变化。
  • 我也排除了这个。
  • 设置优先级(优先级过程,标识,19)
  • 它总是返回-1,并且errno是ESRCH(没有这样的进程)。为什么这不起作用?
  • 根据this,它可以用来改变线程的优先级。
  • 系统调用(SYS_sched_setattr,标识和属性,标志)

结构调度属性属性;无符号整数标志= 0;
属性大小=属性大小;属性调度_nice = 6;属性调度策略=调度其他;

  • 这也不起作用,运气不好。
    我想在不更改策略的情况下降低进程中这些线程的优先级(这会消耗更多CPU)。这将确保与这些线程具有相同优先级的其他线程获得CPU时间
atmip9wb

atmip9wb1#

初步:上下文表明您使用的是Linux,因此这个答案的一部分是特定于Linux的。
我的线程有默认的调度策略SCHED_OTHER,优先级为0,所以没有优先级,也就是说,你不能用(sched_param)param. sched_priority来改变优先级。
这似乎有点曲解了情况。根据sched ( 7 )
对于在常规调度策略(SCHED_OTHERSCHED_IDLESCHED_BATCH)之一下调度的线程,sched_priority不用于调度决策(必须指定为0)。
您似乎将其解释为某种或其他形式的表述,以说明某些系统接口的行为,例如pthread_setschedprio()。也许这来自于"它必须指定为0",但是要关注的部分是"不用于调度决策"。根据SCHED_OTHER策略调度的线程实际上根本不具有优先级属性。它们的时间表不考虑任何此类属性。
1.因此,这意味着排除了使用系统调用pthread_setschedparam。
嗯,不,不完全是这样。使用pthread_setschedparam(),你可以设置策略和优先级。如果你设置的策略考虑了线程优先级,那么你也可以有意义地设置优先级。我并不推荐这样做。

  1. pthread_setschedprio(std::thread::native_handle(),-1)-这不会影响线程的优先级。
    如果线程的调度策略是SCHED_OTHER,就不应该这样,同样,根据该策略调度的线程实际上没有优先级,根据文档,它们的priority属性的(unused)值应该是0。
    我使用getpriority(PRIO_PROCESS,tid)进行了验证。
    您 * 应该 * 通过观察pthread_setschedprio()是否因EINVAL而失败来进行验证。
    我们可以使用pthread_setschedprio()作为默认调度器吗?
    如果"默认调度程序"指的是SCHED_OTHER,则否。请参见上文。如果包括实时调度程序SCHED_FIFOSCHED_RR,则对于通过这些调度程序调度的线程,是。
    在仔细阅读了这个页面之后,我了解到需要通过调整nice值来更改线程的动态优先级
    传统上和每个POSIX,单个线程没有"nice"值。这些是 * processes * 的属性。在这种情况下的系统上,您不能使用nice为同一进程的不同线程产生不同的调度行为。
    然而,在Linux上,单个线程 * 确实 * 有它们自己的优点,我并不特别推荐依赖这一点,但是如果您
  • 不需要Linux以外的可移植性,
  • 必须提供一个进程的某些线程相对于该进程的其他线程的优先调度,并且
  • 必须使用SCHED_OTHER调度策略

那这可能是你最好的选择。

  • 设置优先级(优先级过程,标识,19)
  • 它总是返回-1,并且errno是ESRCH(没有这样的进程)。为什么这不起作用?

系统告诉你id不是一个有效的进程ID。我推测它是通过std::thread::native_handle()获得的pthread_t,但是注意,尽管在Linux上,setpriority(PRIO_PROCESS, ...)可以设置每个线程的niceness,但是它所期望的pid_t标识符并不是从pthreads线程标识符所在的空间中提取的。
1.系统调用(SYS_sched_setattr,标识和属性,标志)
如果您使用的是从setpriority()中引出ESRCH的同一个id,那么我不会期望sched_settatr系统调用会因为您直接调用它而更喜欢它。

相关问题