gpt4 book ai didi

c++ - 是否有必要在互斥锁上调用 pthread_mutex_destroy?

转载 作者:可可西里 更新时间:2023-11-01 15:02:25 24 4
gpt4 key购买 nike

我在C++程序中使用pthread_mutex_t,如下:

class Mutex : public noncopyable
{
public:
Mutex()
{
pthread_mutex_init(&m_mutex, NULL);
}

void acquire()
{
pthread_mutex_lock(&m_mutex);
}

void release()
{
pthread_mutex_unlock(&m_mutex);
}

private:
pthread_mutex_t m_mutex;
};

(类不可复制 - http://www.boost.org/doc/libs/1_53_0/boost/noncopyable.hpp)

我不明白的事情 - 在析构函数中调用 pthread_mutex_destroy 是否被认为是错误?我读过的文档没有说明必须调用 destroy。

有谁知道,pthread_mutex_destroy 实际上做了什么,在什么条件下需要它?

编辑

pthread_mutex_destroy 的答案是否也适用于 pthread_cond_destroy 等?对我来说,它们几乎像是无用的函数,除非 pthread_mutex_init 等。阿尔。正在分配内存? (对我来说,文档对此并不完全清楚。)

调用 destroy 对我来说并没有什么坏处,所以这个问题主要是学术性的。

无论如何,在 linux 上,destroy 似乎只会将互斥体设置为无效状态:

int
__pthread_mutex_destroy (mutex)
pthread_mutex_t *mutex;
{
if ((mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP) == 0
&& mutex->__data.__nusers != 0)
return EBUSY;

/* Set to an invalid value. */
mutex->__data.__kind = -1;

return 0;
}

(来自 glibc-2.14/nptl/pthread_mutex_destroy.c)。

最佳答案

如果有人为您提供了销毁函数,那么您需要在对象超出范围之前调用它作为对该对象的最终操作。

在 API 无效的架构和实现中,这将被优化掉,但是如果 API 将来更改为需要清理内部状态并且您的代码不调用它,您的代码现在将具有内存和/或资源泄漏。

所以简单的答案是肯定的;您必须调用此 API - 事情就是这样 - 即使 API 目前什么都不做,因为尽管 API 本身在未来会永远固定,但 API 背后的实现却不是。 p>

关于c++ - 是否有必要在互斥锁上调用 pthread_mutex_destroy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14721229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com