2014-10-29 160 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

相关问题