c – 具有实时优先级的pthreads

c – 具有实时优先级的pthreads,第1张

概述我需要管理具有不同优先级的线程池,因此我编写了以下线程启动过程: staticint startup(thrd_t *thrd, thrd_sync_t *sync, int prio){ pthread_attr_t attr; int err; struct sched_param param = { .sched_priority = prio 我需要管理具有不同优先级的线程池,因此我编写了以下线程启动过程:
staticint startup(thrd_t *thrd,thrd_sync_t *sync,int prio){    pthread_attr_t attr;    int err;    struct sched_param param = {        .sched_priority = prio    };    assert(pthread_attr_init(&attr) == 0);    assert(pthread_attr_setschedpolicy(&attr,SCHED_FIFO) == 0);    assert(pthread_attr_setschedparam(&attr,&param) == 0);    err = pthread_create(&thrd->handler,&attr,thread_routine,(voID *)thrd);    pthread_attr_destroy(&attr);    return err;}

原则上,不应允许非特权用户执行此代码:pthread_create()调用应返回EPERM,因为运行具有高优先级的线程具有安全隐患.

出乎意料的是,它适用于普通用户,但它根本不尊重给定的优先级.

我尝试通过删除pthread_attr_t并在创建线程后设置调度属性来修改代码:

staticint startup(thrd_t *thrd,int prio){    pthread_attr_t attr;    int err;    struct sched_param param = {        .sched_priority = prio    };    err = pthread_create(&thrd->handler,NulL /*&attr*/,(voID *)thrd);    if (err != 0) return err;    err = pthread_setschedparam(thrd->handler,SCHED_FIFO,&param);    if (err != 0) return err;    return err;}

顺便说一下,这种方法管理起来要困难得多,因为如果出现错误,我需要终止新创建的线程.至少它似乎在权限要求方面正常工作(只有root可以执行此 *** 作),但仍然不遵守优先级.

难道我做错了什么?

编辑

我刚刚添加了以下一段由每个线程执行的代码:

staticvoID getinfo (){    struct sched_param param;    int policy;    sched_getparam(0,&param);    DEBUG_FMT("Priority of this process: %d",param.sched_priority);    pthread_getschedparam(pthread_self(),&policy,&param);    DEBUG_FMT("Priority of the thread: %d,current policy is: %d and should be %d",param.sched_priority,policy,SCHED_FIFO);}

使用第一种方法(即pthread_attr_t方法),结果是pthread_attr_setschedpolicy完全无效,因为优先级为0且策略不是SCHED_FIFO.

使用第二种方法(即pthread_setschedparam方法),该函数打印预期的数据,但执行仍然以错误的方式运行.

解决方法 我认为您还必须使用pthread_attr_setinheritsched来确保考虑对优先级设置的更改.从手册页:

PTHREAD_inherit_SCHED
SpecifIEs that the scheduling policy and associated attributes are
to be inherited from the creating
thread,and the scheduling attributes
in this attr argument are to be
ignored.

PTHREAD_EXPliCIT_SCHED
SpecifIEs that the scheduling policy and associated attributes are
to be set to the corresponding values
from this attribute object.

在手册页中,您还有以下内容:

The default setting of the inherit-scheduler attribute in a newly initialized thread attributes object is PTHREAD_inherit_SCHED.

总结

以上是内存溢出为你收集整理的c – 具有实时优先级的pthreads全部内容,希望文章能够帮你解决c – 具有实时优先级的pthreads所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存