【问题标题】:Is it neccessary to call the pthread_mutex_destroy when free a struct memory which contains a pthread_mutex_t释放包含 pthread_mutex_t 的结构内存时是否需要调用 pthread_mutex_destroy
【发布时间】:2021-08-20 08:11:05
【问题描述】:

假设我有一个结构:

typedef struct peer_info {
        int ip;
        int port;
        int offset;
        pthread_mutex_t mutex;
} peer_info;

然后我使用结构并释放结构,如下所示:

peer_info* p_info = (peer_info*)malloc(sizeof(peer_info));
pthread_mutex_init(&p_info->mutex, NULL);

/* do some work on the p_info */


// need I call the pthread_mutex_destory(&p_info->mutex); ?
free(p_info);

我检查了 glibc ntpl 源代码,似乎我不需要显式调用pthread_mutex_destory(),因为pthread_mutex_t 上没有分配内存,这是一个联合类型。

【问题讨论】:

  • 如果pthread_mutex_init 进行一些动态分配或以其他方式创建或分配某种资源会怎样?如果您不调用pthread_mutex_destory,该资源将如何变得未分配或销毁?仅仅因为一个非常具体的实现没有做到这一点,并不意味着所有的实现都一样。
  • @Someprogrammerdude 老兄,它不分配内存。检查code.woboq.org/userspace/glibc/nptl/pthread_mutex_init.c.html
  • 再一次,一个特定的实现并不意味着所有的实现都一样。
  • @Someprogrammerdude 假设它不分配内存,不调用 pthread_mutex_destory() 是否安全?
  • Re "让我们假设它不分配内存",这样就不安全了。它可以分配其他种类的资源。其他互斥操作仍然可以分配内存或其他类型的资源。

标签: c linux pthreads


【解决方案1】:

我在 Richard 的 APUE 书上找到了答案。

互斥变量由 pthread_mutex_t 数据类型表示。在我们之前 可以使用互斥变量,我们必须首先通过将其设置为常量来初始化它 PTHREAD_MUTEX_INITIALIZER(仅用于静态分配的互斥锁)或调用 pthread_mutex_init。如果我们动态分配互斥锁(通过调用 malloc,对于 例如),那么我们需要在释放内存之前调用 pthread_mutex_destroy。

【讨论】:

    【解决方案2】:

    是的。如果您已使用pthread_mutex_init() 初始化互斥锁,则应在释放内存之前使用pthread_mutex_destroy() 将其销毁。

    POSIX 标准考虑了互斥锁完全驻留在pthread_mutex_t 类型中的两种实现,以及该类型仅包含对某些外部分配互斥对象的引用的实现。由于各种资源耗尽的原因,pthread_mutex_init() 允许失败这一事实进一步强化了这一点。

    在适当的情况下调用pthread_mutex_destroy() 可确保您的代码可移植到后一种实现。

    【讨论】:

    • 感谢 caf,以及类型仅包含对某些外部分配的互斥对象的引用的实现,它将分配一些内存和指向它的指针?所以我们必须显式调用pthread_mutex_destory()?
    • @SeanKuo:是的。或者它可能会分配一个内核级对象而不是内存 - 这同样适用,您必须调用 pthread_mutex_destroy()。
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2013-05-12
    • 2017-05-07
    相关资源
    最近更新 更多