gpt4 book ai didi

c - 具有实时优先级的 pthreads

转载 作者:太空狗 更新时间:2023-10-29 17:21:50 31 4
gpt4 key购买 nike

我需要管理一个具有不同优先级的线程池,所以我写了下面的线程启动过程:

static
int 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 并在创建线程后设置调度属性来修改代码:

static
int startup(thrd_t *thrd, thrd_sync_t *sync, int prio)
{
pthread_attr_t attr;
int err;
struct sched_param param = {
.sched_priority = prio
};

err = pthread_create(&thrd->handler, NULL /*&attr*/, thread_routine,
(void *)thrd);
if (err != 0) return err;

err = pthread_setschedparam(thrd->handler, SCHED_FIFO, &param);
if (err != 0) return err;

return err;
}

顺便说一句,这种方法更难管理,因为如果出现错误,我需要终止新创建的线程。至少它在权限要求方面似乎可以正常工作(只有 root 可以执行此操作),但仍然不尊重优先级。

我做错了什么吗?

编辑

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

static
void 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3206814/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com