如果我在最后一个程序中不使用sem_destroy,它可能会导致什么影响?可能会出现一些严重的问题吗?
答案 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,那么存储信号量的地址将保存信号量的最后一个值...
它可能会导致问题,因为信号量的先前值可能表示进程仍在运行,即使它不是!