【问题标题】:initialize pthread mutex lock inside a C struct在 C 结构中初始化 pthread 互斥锁
【发布时间】:2020-08-07 10:39:13
【问题描述】:

我正在尝试编写一个 C 项目来模拟航空公司的空中交通管制。有一个 Plane 结构必须有一个互斥锁和条件。

这是结构:

typedef struct Plane {
    int ID;
    int arrival_time;
    pthread_mutex_t lock;
    pthread_cond_t cond;
}Plane;

还有创建和使用Plane 结构的着陆/离开函数。但是,我不知道如何在函数内初始化结构的互斥锁。

void landing_func(int arrival_time)
{
    Plane plane;
    plane.ID = ++plane_id;
    plane.arrival_time = arrival_time;
    // initialize lock and cond here

};

但是,我不知道该怎么做。我还声明了一个创建并返回 Plane*

的函数
Plane* createPlane(int arrival_time){

    Plane* plane;
    plane = (Plane*)malloc(sizeof(Plane));
    plane->arrival_time = arrival_time;
    plane->ID = ++plane_id;
    pthread_mutex_init(&plane->lock, NULL);
    pthread_cond_init(&plane->cond, NULL);

    return plane;
};

我不确定这个初始化的正确性。

一个小问题:我可以返回Plane 而不是Plane* 吗?我在其他功能中需要Plane 而不是Plane*。

【问题讨论】:

  • 关于您的“小问题”,答案是否。您正在通过malloc 分配指向区域的指针,因此您必须返回指针。通常,将指向struct 的指针传递给函数比将整个 结构内容传递到堆栈上更容易。还有哪些其他函数采用Plane [作为参数]。例如,在landing_func 中使用Plane [可能] 是错误的(即)在设置之后,数据会去哪里——它是返回还是传递给另一个函数?请编辑您的问题并发布您的整个代码。
  • 例如,更可能的是,您可能想要:Plane *plane = createPlane(3); landing_func(plane,7); 并更改为:void landing_func(Plane *plane, int arrival_time)

标签: c pthreads locking mutex


【解决方案1】:

但是,我不知道如何在函数中初始化结构的互斥锁。

不清楚你的困惑是什么。

互斥锁和条件变量初始化函数需要一个指向要初始化的对象的指针作为第一个参数,这是非常自然的。如果您想要默认属性,它们的第二个参数可以是空指针,您可能会这样做。

给定

Plane plane;

,与您的第一个示例一样,您要初始化的互斥锁是plane.lock。 address-of 运算符将产生一个指向它的指针:&plane.lock(或者如果您不确定优先级并且懒得查找它,那么&(plane.lock) 会避免优先级问题)。因此,您可以使用

对其进行初始化
pthread_mutex_init(&plane.lock, NULL);

CV 类似。

我想主要要欣赏的是互斥体作为结构的成员并不构成特殊情况。作为结构成员或数组元素的对象与不包含在此类聚合中的相同类型的对象具有相同的属性。区别仅在于您引用此类对象的方式。

我还声明了一个函数,该函数创建并返回 Plane* [...] 我不确定此初始化的正确性。

没关系,你应该也能从我之前的cmets中推断出来。

一个小问题:我可以返回Plane 而不是Plane* 吗?我需要Plane 在其他函数中,而不是 Plane*。

我认为您专门指的是第二个示例,在该示例中,您为Plane 动态分配空间。是的,您可以返回 Plane 而不是 Plane *,假设您调整了函数的返回类型,但这违背了动态分配的目的。此外,如果您天真地这样做(例如 return *plane;),那么您将泄漏内存。

但非常重要的是要明白,当您传递或返回一个对象时,您就是将该对象的一个副本传递给接收者。曾经有一个,突然有两个。*另外,它是浅拷贝,所以两者可能不是完全独立的。在某些情况下可以这样,但您的情况并非如此。我保证以这种方式传递您的Plane 结构将使您在您的特定程序中永无止境,因为它依赖于互斥锁和属于每个程序的 CV。那里也有其他问题,但互斥锁和 CV 是最明显的问题。

帮自己一个大忙,适应通过指针而不是复制来交换Planes。这可能需要一些调整,并且该模式有其自身的问题需要解决,但相信我:另一种方式会给你带来灾难。


* 这同样适用于指针和任何其他类型的对象,但是如果你传递一个指针的副本,那么只有指针本身被复制,并且副本指向同一个对象和原始对象一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多