我正在尝试为我正在处理的项目编写一个半便携式线程类,并且在尝试设置线程的优先级时,我在 pthread 世界中遇到了一个难题。
给定以下代码:
#include <stdio.h>
#include <unistd.h>
#include <sched.h>
main()
{
printf("Valid priority range for SCHED_OTHER: %d - %d\n",
sched_get_priority_min(SCHED_OTHER),
sched_get_priority_max(SCHED_OTHER));
printf("Valid priority range for SCHED_FIFO: %d - %d\n",
sched_get_priority_min(SCHED_FIFO),
sched_get_priority_max(SCHED_FIFO));
printf("Valid priority range for SCHED_RR: %d - %d\n",
sched_get_priority_min(SCHED_RR),
sched_get_priority_max(SCHED_RR));
}
在 OpenBSD 中,这将打印以下内容:
Valid priority range for SCHED_OTHER: 0 - 31
Valid priority range for SCHED_FIFO: 0 - 31
Valid priority range for SCHED_RR: 0 - 31
在 Ubuntu 中,它会产生这个:
Valid priority range for SCHED_OTHER: 0 - 0
Valid priority range for SCHED_FIFO: 1 - 99
Valid priority range for SCHED_RR: 1 - 99
我的问题更多的是关于SCHED_OTHER
优先级。根据我能够收集的所有文档(sched.h、google、SO、SE),我的理解是应该尝试检索当前进程的进程优先级并基于此分配优先级。这很好,除非在检索SCHED_OTHER
. 由于调度是系统相关的,如果我获得当前进程的优先级SCHED_OTHER
并尝试在 Ubuntu(或我遇到的其他 linux 系统)上获得最小/最大值,我的值将是 0-0,它赢了不适用于尝试设置有效的优先级范围。SCHED_OTHER
但是,我确实在其他类 unix 系统(OpenBSD 等)上获得了有效值。
由于我主要关心的是只尝试获得有效范围的优先级值(以确保用户不会输入太高或太低的值),我是否应该不打扰当前进程的优先级而只获得最小值/最大值值SCHED_FF
或SCHED_RR
因为这些值似乎给了我遇到的各种 linux/unix 系统的有效范围,还是我完全错过了这一点?
提前致谢,如果我不清楚或错误陈述,请告诉我。
编辑1:请注意,我主要关心的是一种“便携式”方式来获得比进程优先级本身更多的有效范围..谢谢!