如果我不破坏信号量会发生什么?

时间:2014-10-29 05:41:17

标签: memory-management operating-system semaphore

如果我在最后一个程序中不使用sem_destroy,它可能会导致什么影响?可能会出现一些严重的问题吗?

2 个答案:

答案 0 :(得分:2)

这是特定于操作系统的。在Linux上,阅读sem_overview(7);实际上你处于一个未指明的情况。但是,文档说

  

在使用之前,必须初始化未命名的信号量                 使用sem_init(3)。然后可以使用它进行操作                 sem_post(3)和sem_wait(3)。当信号量不再存在时                 必需的,并且在它所在的存储器之前                 取消分配,信号量应该使用                 sem_destroy(3)。

所以您应该在适当的时候致电sem_destroy ;不要冒全系统资源泄漏的风险。 BTW文档sem_destroy(3)告诉我们:

  

之前应使用sem_destroy()销毁未命名的信号量       它所在的内存被释放。没有这样做       可能导致某些实现上的资源泄漏。

对于命名的信号量,事情是不同的(它们位于/dev/shm/)。我猜一个线程共享的信号量可能会在其内存段被删除时被销毁(不再被任何进程映射)。我不确定这是否是特定于实现的行为,所以不要依赖于此。

还使用proc(5)

那么可能发生的是系统范围的 resource leak而您并不想要它。您可能需要重新启动才能将其删除。顺便说一句,您可以使用strace(1)找出所涉及的实际系统调用,您可以查看GNU glibc(或其他一些libc,如musl-libc)的源代码 - 也许Linux内核 - 了解更多特定于实现的行为。

避免使用undefined behavior

答案 1 :(得分:1)

如果你不使用sem_destroy,那么存储信号量的地址将保存信号量的最后一个值...

它可能会导致问题,因为信号量的先前值可能表示进程仍在运行,即使它不是!