pthread_attr_setschedparam return 非零

pthread_attr_setschedparam return non-zero

我在虚拟机 (Ubuntu) 上执行了这段代码,我得到了一个非零的 e,但是当我在我的主机上执行它时 OS (MacOS)我得到一个零。有人可以解释是什么导致它 return 非零吗?

  pthread_attr_init(&arrt);
  struct sched_param param;
  pthread_attr_getschedparam (&arrt, &param);
  int e = pthread_attr_setschedparam (&arrt, &param);

编辑 -

#include <pthread.h>
#include <stddef.h>
#include <stdio.h>

void* function1(void* arg) {
    struct sched_param param;
    int priority, policy;
    pthread_getschedparam(pthread_self(), &policy, &param);
    priority = param.sched_priority;
    printf("thread priority: %d\n", priority); // I get 0
}

int main() {
    struct sched_param param;
    pthread_t thread;
    pthread_attr_t arrt;

    pthread_attr_init(&arrt);
    pthread_attr_getschedparam(&arrt, &param);
    pthread_attr_setschedpolicy(&arrt, SCHED_FIFO);
    param.sched_priority = 10;
    int e = pthread_attr_setschedparam(&arrt, &param);
    printf("e: %d\n", e); // now I get 0
    pthread_create(&thread, &arrt, &function1, NULL);
    pthread_attr_destroy(&arrt);
}

Unix 最初不支持线程;然后一堆不同的 Unix 实现(主要来自商业供应商)以他们自己的 different/incompatible 方式添加了对线程的支持;然后 POSIX 出现了(在为时已晚之后)并试图创建他们的“pthreads”标准,但是因为太晚了(或者因为他们不想打乱任何现有的实现)他们的“标准”变得足够灵活以支持所有 pre-existing 实现,有效地使标准成为调度策略和线程优先级等方面毫无价值的笑话。

MacOS 主要设计用于线程优先级很重要的“桌面类”场景(例如,在重负载下,您不希望在应用程序获得时间之前等待 1234 个其他线程使用它们的时间片响应按键),所以他们很可能安排得当。 Linux 在“所有线程都是平等的,让我们公平一点,给所有任务平等分配 CPU 时间”的胡言乱语中长大,并且(对于默认调度策略)大多忽略显式线程优先级(和 IO 优先级) ), 并且在某些部分不符合 POSIX 规范。

要解决此问题,您需要 OS 特定代码或更糟。具体来说,对于 Linux,使用 nice() 可能更好(这应该是针对整个进程并且应该影响进程中的所有线程,但不是因为 Linux 不符合 POSIX 规范)并且懒得尝试使用 pthread 的线程优先级;部分原因是让它们真正有用的唯一方法是创建一个 real-time 线程(这需要普通软件不需要的特殊权限)。

Can someone explains what causes it to return a non-zero?

本质上;不同的操作系统支持(或不支持)不同的 POSIX 规范。