通过设置互斥锁的process-shared
属性(使用pthread_mutexattr_setpshared),根据pthread_mutexattr_init的联机帮助页,它允许互斥锁存在于创建它的进程的生命周期之外:
特别是,这些过程可能存在于初始化过程的生命周期之外。
那么,如果我在mmap(2)
d文件中创建多个进程可以访问的互斥锁,那么我unlink(2)
该文件会导致内核持久性内存泄漏吗?如果是这样,那么僵尸互斥锁的数据究竟存在于实现的角度?
答案 0 :(得分:1)
的Prolog
本手册页是POSIX程序员手册的一部分。此接口的Linux实现可能有所不同(有关Linux行为的详细信息,请参阅相应的Linux手册页),或者可能无法在Linux上实现该接口。
Michael Kerrisk的man7.org是linux man-pages项目的主页: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(开放组基本规范第6期 - IEEE Std 1003.1,2004版);示例就像在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 }