2014-10-29 156 views
1

如果我在最後的程序中不使用sem_destroy,它可能會導致什麼影響?會發生一些嚴重的問題嗎?如果我不摧毀信號量會發生什麼?

+1

我聽說它可能導致內存泄漏,會發現更多並回答它。 – 2014-10-29 05:44:21

+0

鑑於你提到'sem_destroy',我們在談論用C編寫的程序嗎? – 2014-10-29 05:46:34

+1

試圖找出RTFM的含義。 – 2014-10-29 06:08:21

回答

2

它是特定於操作系統的。在Linux上,請閱讀sem_overview(7);實際上你是處於一個不確定的情況。然而,文件說,

的使用前,一位不願透露姓名信號必須使用sem_init初始化 (3)。然後可以使用 sem_post(3)和sem_wait(3)進行操作。當信號量不再需要 ,並且在其所在的存儲器被解除分配之前,應該使用 sem_destroy(3)銷燬信號量。

所以你應該叫sem_destroy在適當的時候;不要冒全系統資源泄漏的風險。順便說一句的sem_destroy(3)文檔講述:

的未命名信號應與 在其所位於被釋放存儲器前sem_destroy()被破壞。如果不執行此操作,可能會導致某些實現出現資源泄漏。

對於命名爲信號燈,情況就不同了(他們坐在/dev/shm/)。我想線程共享信號可能會被刪除,當其內存段被刪除(不再有任何進程映射)。我不確定這一點,它是特定於實現的行爲,所以不要依賴於此。

也使用proc(5)

那麼可以發生是全系統resource leak,你不想要它。您可能需要重新啓動才能將其刪除。順便說一下,你可以使用strace(1)找出涉及的實際系統調用,並且可以查看GNU glibc(或其他一些libc,如musl-libc)的源代碼 - 也許可以是Linux內核 - 以瞭解更多實現特定行爲。

避免undefined behavior

+0

好吧,你的意思是分配給程序的資源不會被分配,除非我銷燬信號量? – Mike3162114 2014-10-29 06:25:08

+0

是的*可能會發生(或可能不會!)。確切的行爲是未定義的,並且是特定於實現的。 – 2014-10-29 06:28:42

1

其中旗語存儲,如果你不使用sem_destroy將持有信號量的最後一個值的地址...

這可能會導致問題,因爲信號燈的前值可能表明一個過程仍在運行,即使不是這樣 !

+0

什麼問題,這就是問題所在。 – Mike3162114 2014-10-29 06:20:03

相關問題