首页 > 解决方案 > 在 C 结构中初始化 pthread 互斥锁

问题描述

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

这是结构:

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*.

标签: cpthreadslockingmutex

解决方案


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

不清楚你的困惑是什么。

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

给定

Plane plane;

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

pthread_mutex_init(&plane.lock, NULL);

类似的简历。

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

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

没关系,因为您也应该能够从我之前的评论中推断出来。

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

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

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

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


*这同样适用于指针和任何其他类型的对象,但是如果您传递指针的副本,则仅复制指针本身,并且副本指向与原始对象相同的对象。


推荐阅读