c - 无法使用 SCHED_RR 在创建时设置 pthread 优先级

标签 c multithreading pthreads linux-capabilities

如何获得以初始优先级创建的 pthread 线程?在下面的代码中,我声明了执行此操作所必需的上限,事实上,它确实将线程的优先级更改为 15,但由于某种原因线程总是以优先级 0 开始,即使我指定它需要 SCHED_RR。

我还通过使用 sudo setcap CAP_SYS_NICE+eip [program] 确保程序具有正确的功能。我试过以普通用户和 root 身份运行它。在这两种情况下都是一样的。

那么,我错过了什么? :)

谢谢!

/* compiled with -lpthread -lcap */

#include <stdlib.h>
#include <stdio.h>
#include <sys/capability.h>
#include <pthread.h>
#include <unistd.h>

pthread_t mythread;

void myfunction()
{
    int i ;
    int err_code;
    int policy;
    struct sched_param schedule;

    for (i=0; i < 70; i++)
    {
        pthread_getschedparam(pthread_self(), &policy, &schedule);
        printf("My policy is %d. My priority is %d\n", policy, schedule.sched_priority);
        sleep(1);
    }
}

int main()
{
    cap_t caps;
    char myCaps[] = "cap_sys_nice+eip";
    int err_code;
    int policy = SCHED_RR;
    struct sched_param schedule;
    pthread_attr_t attr;

    caps = cap_from_text(myCaps);

    if (caps == NULL)
    {
        printf("Caps is null :(\n");
        return 1;
    }

    printf("I have capabilities!\n");


    schedule.sched_priority = 80; //SCHED_RR goes from 1 -99
    pthread_attr_init(&attr);
    pthread_attr_setschedpolicy(&attr, policy);
    pthread_attr_setschedparam(&attr, &schedule);
    pthread_create(&mythread, NULL, (void *) &myFunction, NULL);
    sleep(3);

    schedule.sched_priority = 15; //Arbitrary, for testing purposes

    err_code = pthread_setschedparam(mythread, policy, &schedule);
    if (err_code != 0)
    {
        printf("I have failed you, master! Error: %d\n", err_code);
    }

    pthread_join(mythread, NULL);
    cap_fee(caps);

    return 0;
}

最佳答案

看起来您还必须使用 PTHREAD_EXPLICIT_SCHED 调用 pthread_attr_setinheritsched 以使其覆盖父(创建)线程的属性。

http://man7.org/linux/man-pages/man3/pthread_attr_setinheritsched.3.html

pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);

关于c - 无法使用 SCHED_RR 在创建时设置 pthread 优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26243495/

相关文章:

计算动态数组读取的复杂度

java - Android 在主线程上做了太多事情 : Tried separate threads

Linux Pthreads 用户级或内核级

c - 如何创建结构体并通过 pthread_create() 传递给新线程

c - C程序无输出

c - -Werror 导致编译器在#warning 处停止。我能做些什么来防止这种情况发生?

c - 如何访问在主线程中定义的变量?

ios - 如何知道另一个线程是否正在访问资源?

c++ - 如何维护对另一个类中元素的线程安全引用

c - sigwait 在 MacOS 上复制和转换信号