如何在使用信号量时避免资源泄露?

3

Linux中的sem_destroy()文档表示:

在释放存储它的内存之前,应该使用sem_destroy()来销毁未命名的信号量。否则,某些实现可能会导致资源泄漏。

但我所能做的最好的办法是将sem_destroy()注册到atexit(),这不会在异常终止或SIGKILL时被调用。我有一个负责在共享内存上(一个mmaped文件)创建和销毁信号量的进程,如何避免在异常终止条件下的资源泄漏?

如果在调用sem_destroy()之前删除了mmaped文件,则在Linux上是否会发生任何类型的资源泄漏?是什么资源?

1个回答

4

glibc实现的sem_destroy什么也不做,这将不会改变。如果您使用glibc,则无需执行任何操作以释放资源。此外,内核在进程终止时会自动释放这些资源。

信号量的glibc实现基于futexes,因此除了用于存储信号量的内存之外,它不需要任何其他资源。


如果信号量在进程之间共享,内核无法释放资源。任何时候都可能产生一个新的进程尝试使用该信号量。 - lvella
与文件相关联的存储资源,而不是进程。等待futexes需要一些存储空间,但只在等待时才需要,因此这里也无关紧要。事实上,我很难想象一个符合规范的进程共享信号量实现,在其中sem_destroy实际上会释放任何资源。 - Florian Weimer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接