提问人:czg 提问时间:2/8/2023 最后编辑:wohlstadczg 更新时间:2/9/2023 访问量:115
在C语言中,pthread_mutex_t使用后需要释放吗?
In C language, do pthread_mutex_t need to be released after use?
问:
我在我的程序中使用线程同步控制。
不再使用时,我需要做一些收尾工作吗?
或者,我可以什么都不做吗?pthread_mutex_t
pthread_mutex_t
谢谢你的帮助
答:
您提到“pthread_mutex_t已不再使用”。
我假设你的意思是你不再需要在任何线程中使用它。
在这种情况下:
- 必须处于解锁状态。
pthread_mutex_t
- 您应该调用 .
pthread_mutex_destroy
解锁互斥锁的要求出现在pthread_mutex_destroy
文档中:
销毁已解锁的初始化互斥锁应该是安全的。 尝试销毁锁定的互斥锁会导致未定义的行为。
(强调是我的)
这篇文章包含有关正确用法的更多信息:
如何使用 pthread_mutex_destroy 在 Linux 中安全正确地销毁互斥锁?。pthread_mutex_destroy
评论
我在我的程序中使用线程同步 控制。
不再使用时,我需要做一些收尾工作吗?
或者,我可以什么都不做吗?pthread_mutex_t
pthread_mutex_t
TL;DR:你不需要做任何清理。在某些情况下,你应该这样做,而在其他情况下,这是一个风格问题。在某些情况下,这个问题是没有意义的,因为不可能识别出互斥锁不再使用。
此处“不再使用”的相关含义是,互斥锁当前未被任何线程(包括可能执行清理的线程)锁定,并且将来不可能有任何线程尝试锁定它。在这种情况下,该函数可用于释放互斥锁可能持有的任何资源(不包括互斥锁对象本身占用的存储)。在任何其他情况下,销毁互斥锁都会使程序面临执行未定义行为的风险。pthread_mutex_destroy()
如果给定的互斥对象曾经被初始化过,包括通过静态初始值设定项,并且其生存期在自上次初始化以来尚未被销毁的点结束,则必须假定其生存期的结束会泄漏资源。但只有当互斥锁的生存期在程序结束之前结束时,这才有意义,因为当进程终止时,操作系统会清理属于进程的所有资源。特别是,在任何翻译单元中,在文件范围内声明互斥对象的常见情况下,它并不重要。
然后进行指导:
作为正确性问题,您必须确保
- 互斥对象的生存期在仍在使用时不会结束。
- 互斥锁在仍在使用中或在其生命周期结束后不会被销毁。
实际上,您应该避免间接的资源泄漏,因为它们最终可能导致程序失败和/或资源耗尽导致的整体系统压力。在这种情况下,这意味着在这些对象的生命周期结束之前,使用清理具有自动、分配或线程存储持续时间的互斥对象,而这种情况在程序整体结束之前发生。
pthread_mutex_destroy()
作为样式问题,您可以选择将类似的规则应用于具有静态存储持续时间的互斥对象 - 可能仅通过 初始化的对象,或者可能还包括通过静态初始值设定项宏初始化的对象。我自己倾向于不担心这些,因为很少有很多,而且在程序无论如何都会终止之前,它们很少会停止使用。
pthread_mutex_init()
在风格方面,您不应该做出英勇的努力或使代码过于复杂,以确保在程序终止时显式销毁互斥锁。无论如何,操作系统都会执行所有必要的清理,任何需要花费大量精力才能正确编写的清理(或其他)代码都是错误滋生的沃土,并且维护成本很高。
最后,请注意,在某些情况下,您甚至无法在程序终止之前识别给定的互斥锁不再使用。例如,考虑一个程序,该程序声明一个文件范围互斥锁,用于同步多个守护程序线程的操作。很可能系统中没有一个线程可以确定是否所有(其他)守护程序线程都已终止,从而知道互斥锁不再使用,因此除了避免显式销毁它之外,没有安全的方法。
评论
pthread_mutex_destroy
pthread_mutex_destroy
的存在是有原因的。可能是你要问的那个。但这取决于你所说的“使用中”是什么意思。例如,“永远不会再被另一个线程使用”?是的,解锁后销毁它。