我看了其他关于这个问题的问题/答案,但没有一个解决了我的问题。
我的线程有默认的调度策略SCHED_OTHER,优先级为0,所以没有优先级,也就是说,你不能用(sched_param)param.sched_priority来改变优先级。
1.因此,这意味着排除了使用系统调用pthread_setschedparam。
- 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时间
1条答案
按热度按时间atmip9wb1#
初步:上下文表明您使用的是Linux,因此这个答案的一部分是特定于Linux的。
我的线程有默认的调度策略SCHED_OTHER,优先级为0,所以没有优先级,也就是说,你不能用(sched_param)param. sched_priority来改变优先级。
这似乎有点曲解了情况。根据
sched
(7
),对于在常规调度策略(
SCHED_OTHER
、SCHED_IDLE
、SCHED_BATCH
)之一下调度的线程,sched_priority
不用于调度决策(必须指定为0)。您似乎将其解释为某种或其他形式的表述,以说明某些系统接口的行为,例如
pthread_setschedprio()
。也许这来自于"它必须指定为0",但是要关注的部分是"不用于调度决策"。根据SCHED_OTHER
策略调度的线程实际上根本不具有优先级属性。它们的时间表不考虑任何此类属性。1.因此,这意味着排除了使用系统调用pthread_setschedparam。
嗯,不,不完全是这样。使用
pthread_setschedparam()
,你可以设置策略和优先级。如果你设置的策略考虑了线程优先级,那么你也可以有意义地设置优先级。我并不推荐这样做。如果线程的调度策略是
SCHED_OTHER
,就不应该这样,同样,根据该策略调度的线程实际上没有优先级,根据文档,它们的priority属性的(unused)值应该是0。我使用getpriority(PRIO_PROCESS,tid)进行了验证。
您 * 应该 * 通过观察
pthread_setschedprio()
是否因EINVAL
而失败来进行验证。我们可以使用pthread_setschedprio()作为默认调度器吗?
如果"默认调度程序"指的是
SCHED_OTHER
,则否。请参见上文。如果包括实时调度程序SCHED_FIFO
和SCHED_RR
,则对于通过这些调度程序调度的线程,是。在仔细阅读了这个页面之后,我了解到需要通过调整nice值来更改线程的动态优先级
传统上和每个POSIX,单个线程没有"nice"值。这些是 * processes * 的属性。在这种情况下的系统上,您不能使用nice为同一进程的不同线程产生不同的调度行为。
然而,在Linux上,单个线程 * 确实 * 有它们自己的优点,我并不特别推荐依赖这一点,但是如果您
SCHED_OTHER
调度策略那这可能是你最好的选择。
系统告诉你
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
系统调用会因为您直接调用它而更喜欢它。