这是pthread_setschedparam的签名:
#include <pthread.h>
int pthread_setschedparam(pthread_t thread, int policy, const struct sched_param *param);
这段代码会导致意外的行为:
void schedule(const thread &t, int policy, int priority) {
sched_param params;
params.sched_priority = priority;
pthread_setschedparam(t.native_handle(), policy, ¶ms);
}
尚不清楚参数的范围是否需要比单独的函数调用更广泛。当我看到一个带有指针的函数时,(至少对我而言)它暗示着它正在寻求对它的所有权。这个签名设计得不好吗? “ sched_params params”是否应该存在于堆中?是否需要延长线程寿命才能保持有效?可以删除吗?
我不知道。
谢谢!
答案 0 :(得分:1)
pthread_setschedparam
设置给定线程的调度策略。调用后,这些参数不必处于活动状态。
如果最后一个参数的生存期很重要(如您所说,如果pthread_setschedparam
拥有所有权),则将对此进行明确记录。但这不在POSIX文档pthread_setschedparam 中。
使用指针(而不是值)的可能原因是,传递指针的费用比struct
便宜。
答案 1 :(得分:1)
当我看到一个带有指针的函数时,它(至少对我而言)暗示它正在寻求对它的所有权。
当我看到一个接受指针参数的函数时,我不会直接跳到那里,我也不认为你应该这样做。尽管了解这种可能性很重要,并且您可以很好地查找文档,但是函数采用指针参数的原因有多种,其中包括:
该函数接受指向结构或联合的指针,因为它符合接口约定,该接口约定适用于不接受结构和联合作为参数的古老C编译器。对于早期的C编译器来说,这是正常的,因为它是最初指定语言的方式:
[T]您只能在结构上执行的操作是使用
&
获取其地址并访问其成员之一。 [...结构]不能传递给函数或从函数返回。 [...]指向结构的指针不受这些限制[。]
(Kernighan和Ritchie, C编程语言,第1章,第版,第6.2节)
标准C没有这些限制,但是在某些地方仍然可以感觉到它们的作用。
该函数期望承担(通常是重新分配)释放指针所指向的动态分配空间的责任,或者它打算制作一个在函数返回后仍然存在的指针的副本,这在列表的下方。如果某个函数打算执行这些操作之一,那么我完全希望它的文档以某种方式表明这一点。
此签名设计不当吗?
不,我认为它的设计是由我清单中的后两点之一或全部提示的。
“ sched_params params”应该存在吗?
我不希望这是必须的。
是否需要使线程有效以保持有效?可以删除吗?
我认为它不需要使设置了属性的线程寿命更长。除了对接口的一般解释之外,我还在函数的POSIX规范的措辞中阅读了该位置的(弱)支持:
pthread_setschedparam()
函数应设置调度策略 及其线程ID为的线程的关联调度参数 由线程给策略和相关参数 提供policy
和param
。
({POSIX specification for pthread_setscheduleparam()
;已添加重点)
“提供”语言向我(再次,较弱地)表明该函数使用指向结构的内容,而不是结构本身。