2016-10-03 80 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