pthread函数参数的范围

时间:2019-01-03 18:06:01

标签: c pthreads

这是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, &params);
}

尚不清楚参数的范围是否需要比单独的函数调用更广泛。当我看到一个带有指针的函数时,(至少对我而言)它暗示着它正在寻求对它的所有权。这个签名设计得不好吗? “ sched_pa​​rams params”是否应该存在于堆中?是否需要延长线程寿命才能保持有效?可以删除吗?

我不知道。

谢谢!

2 个答案:

答案 0 :(得分:1)

pthread_setschedparam 设置给定线程的调度策略。调用后,这些参数不必处于活动状态。

如果最后一个参数的生存期很重要(如您所说,如果pthread_setschedparam拥有所有权),则将对此进行明确记录。但这不在POSIX文档pthread_setschedparam 中。

使用指针(而不是值)的可能原因是,传递指针的费用比struct便宜。

答案 1 :(得分:1)

  

当我看到一个带有指针的函数时,它(至少对我而言)暗示它正在寻求对它的所有权。

当我看到一个接受指针参数的函数时,我不会直接跳到那里,我也不认为你应该这样做。尽管了解这种可能性很重要,并且您可以很好地查找文档,但是函数采用指针参数的原因有多种,其中包括:

  • 该函数通过参数接受数组。这当然是最常见的原因。
  • 该函数要修改调用者指定的对象(通过指针)。这可能是第二常见的原因。
  • 该函数接受指向大型或潜在大型结构或联合的指针,以减轻函数调用的开销
  • 该函数接受指向结构或联合的指针,因为它符合接口约定,该接口约定适用于不接受结构和联合作为参数的古老C编译器。对于早期的C编译器来说,这是正常的,因为它是最初指定语言的方式:

      

    [T]您只能在结构上执行的操作是使用&获取其地址并访问其成员之一。 [...结构]不能传递给函数或从函数返回。 [...]指向结构的指针不受这些限制[。]

    (Kernighan和Ritchie, C编程语言,第1章,第版,第6.2节)

    标准C没有这些限制,但是在某些地方仍然可以感觉到它们的作用。

该函数期望承担(通常是重新分配)释放指针所指向的动态分配空间的责任,或者它打算制作一个在函数返回后仍然存在的指针的副本,这在列表的下方。如果某个函数打算执行这些操作之一,那么我完全希望它的文档以某种方式表明这一点。

  

此签名设计不当吗?

不,我认为它的设计是由我清单中的后两点之一或全部提示的。

  

“ sched_pa​​rams params”应该存在吗?

我不希望这是必须的。

  

是否需要使线程有效以保持有效?可以删除吗?

我认为它不需要使设置了属性的线程寿命更长。除了对接口的一般解释之外,我还在函数的POSIX规范的措辞中阅读了该位置的(弱)支持:

  

pthread_setschedparam()函数应设置调度策略   及其线程ID为的线程的关联调度参数   由线程给策略和相关参数 提供   policyparam

({POSIX specification for pthread_setscheduleparam();已添加重点)

“提供”语言向我(再次,较弱地)表明该函数使用指向结构的内容,而不是结构本身。