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

How can I avoid resource leak when using a semaphore?

Linux sem_destroy() 文档说:

An unnamed semaphore should be destroyed with sem_destroy() before the memory in which it is located is deallocated. Failure to do this can result in resource leaks on some implementations.

但我最多只能将 sem_destroy() 注册到 atexit(),这不会在中止或 SIGKILL 时调用。我有一个进程负责在共享内存(一个映射文件)上创建和销毁一个信号量,我怎样才能避免异常终止条件下的资源泄漏?

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

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

信号量的 glibc 实现基于 futexes,这就是为什么它除了用于存储信号量的内存之外不需要任何额外的资源。