为什么要销毁pthread_cond_t和pthread_mutex_t?

为什么要销毁pthread_cond_t和pthread_mutex_t?,c,multithreading,pthreads,posix,C,Multithreading,Pthreads,Posix,如果在线程代码中,我创建一个pthread\u cond\t c条件变量或互斥体pthread\u mutex\u t m

如果在线程代码中,我创建一个
pthread\u cond\t c条件变量或互斥体
pthread\u mutex\u t m
为什么会这样

另外,如果使用
pthread_cond_init()动态初始化
cond
变量,为什么销毁该变量是非常必要的函数

引用David Butenhof的“使用POSIX线程编程”

动态初始化条件变量时,应 当不再需要条件变量时,通过调用 pthread_cond_destroy。不需要销毁条件变量 这是使用PTHREAD\u COND\u初始值设定项静态初始化的 宏“


pthread_cond_t和pthread_mutex_t被视为资源

处理完资源后需要销毁/清理/关闭资源,就像处理完资源后需要关闭文件或释放内存一样。 否则将导致资源泄漏,您可能会耗尽这些资源

将这些视为一种资源可以让实现在如何实现它们方面有更多的自由,在某些特定的实现中,忘记_destroy()它们可能没有什么害处,其他实现可能会将mutex/condition变量连接到内核资源,当您不再需要它时,需要清理它。的“基本原理”部分提供了更多概述,同样适用于条件变量


如果使用PTHREAD_COND_初始值设定项初始化条件变量,则应该初始化静态分配的互斥体,即它将一直存在到应用程序结束,此时它将被系统销毁,这大概是作者的意思。这也适用于动态初始化的互斥/cond变量,系统也将清理这些变量


当应用程序结束时,大多数资源都会自动清理,因此手动清理所有资源还是让系统在这种情况下进行清理是一种好做法,这是另一种讨论。

我不知道实现方法,但可能它必须连接到资源处理,如释放内存等。听起来有点“不对劲”。如果在“我的进程的所有线程都已终止”之前(即在操作系统终止进程期间)需要condvar,则无法调用pthread_cond_destroy(),因为无法调用它。当然,如果你不断地创建这些东西,而不销毁它们,那就有问题了,但是如果你在应用程序的生命周期中只创建一次condvar,那么在应用程序关闭之前安全地销毁它就没有意义了(至少,在最常见的具有过程资源管理的操作系统中)。“如果使用PTHREAD_COND_初始值设定项初始化条件变量,则应该初始化静态分配的互斥锁,即它将一直存在到应用程序结束“-你是怎么想的?函数局部的条件变量呢?我怀疑真正的原因是,正如PTHREAD_COND_initializer提供的那样,具有默认设置的条件变量不应该需要任何其他资源。但是,如果您使用pthread_cond_init()指定不同的设置,则可能是+1,这几乎是完美的答案。如果不显式销毁某些资源的替代方案是一堆线程关闭代码,那么为什么要为没有收益而费心处理所有额外的麻烦呢?@davmac-我甚至不知道为什么会存在那个宏。有一个初始化condvars的调用,为什么不使用它呢?@davmac,因为docs的状态是这样的,或者至少“静态分配”暗示了这一点。如果要使用PTHREAD\u cond\u初始值设定项初始化堆栈上的cond变量,则不太明显。但如果这样做,则需要pthread_cond_destroy()将其销毁。(同样,除非它在main()的堆栈上,并且在完成后让系统清理它)@MartinJames的基本原理部分告诉您它存在的原因。