【问题标题】:How can I avoid resource leak when using a semaphore?使用信号量时如何避免资源泄漏?
【发布时间】:2019-03-09 20:30:04
【问题描述】:

Linux sem_destroy() 文档说:

一个未命名的信号量应该在它所在的内存之前用sem_destroy() 销毁 位于已解除分配。不这样做可能会导致某些实现的资源泄漏。

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

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

【问题讨论】:

    标签: linux posix semaphore glibc


    【解决方案1】:

    sem_destroy 的 glibc 实现什么都不做,这不会改变。如果你使用 glibc,你不需要做任何事情来释放资源。此外,内核无论如何都会在进程终止时释放这些资源。

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

    【讨论】:

    • 如果信号量在进程之间共享,内核将无法释放资源。任何时候都可能会产生一个尝试使用信号量的新进程。
    • 与文件关联的存储资源,而不是与进程关联的资源。等待的 futex 需要一些存储空间,但只是在等待的时候,所以在这里也没有关系。事实上,我发现很难想象在sem_destroy 实际上释放任何资源的过程共享信号量的一致实现。
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2020-04-23
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多