2016-10-03 58 views
0

通过设置互斥的process-shared属性(pthread_mutexattr_setpshared),它允许一个互斥存在超出创建它的过程的寿命,根据该联机帮助页pthread_mutexattr_init并行线程mutexattr进程共享的存储器泄漏

特别是,这些过程可能存在于初始化过程的整个生命周期之外。

所以,如果我创建了多个进程可以访问mmap(2) d文件中互斥,那么我unlink(2)的文件,会导致内核持久内存泄漏?如果是这样,那么僵尸互斥数据究竟来自实现的观点?

回答

1

Cinolt,你为什么认为linux.die.net发布了linux man page?您有https://linux.die.net/man/3/pthread_mutexattr_init链接,但很难找到linux.die.net在哪里找到文本;作者和日期未列出;并有页注:

序言

本手册页是POSIX程序员手册的一部分。此接口的Linux实现可能有所不同(有关Linux行为的详细信息,请参阅相应的Linux手册页),或者该接口可能不会在Linux上实现。

有由迈克尔·凯里斯克man7.org作为Linux的人的页面项目的主页:https://www.kernel.org/doc/man-pages/ 这里是pthread_mutexattr_init http://man7.org/linux/man-pages/man3/pthread_mutexattr_init.3p.html的人。它很短,没有关于泄漏的信息。

在POSIX中,一些实现可能使用一些内核中的结构来保存mutexattr属性;对于这种实现没有内存泄漏,POSIX要求程序员销毁所有创建的attrs。

没有泄漏(现有超越过程寿命)上http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutexattr_init.html警告 - 单UNIX®规范,版本2 - 从POSIX线程扩展(1003.1c-1995)

衍生而来,但它是在这里http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutexattr_destroy.html(中Open Group Base Specifications Issue 6 - IEEE Std 1003.1,2004 Edition);与例如就像一个die.net页上:与该PTHREAD_PROCESS_SHARED进程共享的属性初始化

同步变量可以通过在能够访问它的任何过程中的任何线程被操作。特别是,这些过程可能会在初始化过程的整个生命周期中存在。例如,下面的代码在可能被许多进程使用的映射文件中实现了一个简单的计数信号量。

在GNU glibc的实际应用中,通常存在于Linux的变化(NPTL - https://en.wikipedia.org/wiki/Native_POSIX_Thread_Library)没有额外的内核结构分配:

http://code.metager.de/source/xref/gnu/glibc/nptl/pthread_mutexattr_init.c

24 __pthread_mutexattr_init (pthread_mutexattr_t *attr) 
26 if (sizeof (struct pthread_mutexattr) != sizeof (pthread_mutexattr_t)) 
27  memset (attr, '\0', sizeof (*attr)); 
28 
32 ((struct pthread_mutexattr *) attr)->mutexkind = PTHREAD_MUTEX_NORMAL; 

,毁坏只是NOP:http://code.metager.de/source/xref/gnu/glibc/nptl/pthread_mutexattr_destroy.c

22 int 
23 __pthread_mutexattr_destroy (pthread_mutexattr_t *attr) 
24 { 
25 return 0; 
26 } 
+0

您提供的代码是用于'pthre ad_mutexattr_destroy'只支持_mutexattr_,而不是_mutex_本身。 [pthread_mutex_destroy](http://code.metager.de/source/xref/gnu/glibc/nptl/pthread_mutex_destroy.c)的源代码看起来很像NOP-ish,但是确实不知道。 –

+0

你的问题是关于mutexattr和错误的手册页。 mutex_destroy http://code.metager.de/source/xref/gnu/glibc/nptl/pthread_mutex_destroy.c包含:stap probe(跟踪工具stap的入口; nop如果没有跟踪正在运行),检查互斥使用计数器对于某些类型的互斥体,并将互斥体类型重置为不正确的类型。因此,NPTL中的互斥量也没有额外的内存;它不需要释放内核内存。在glibc的NPTL中,mutex和mutexattr都是无泄漏的。 – osgx