【问题标题】:What may happen if sem_destroy() is not invoked on a semaphore in C? [closed]如果 sem_destroy() 没有在 C 中的信号量上调用,会发生什么? [关闭]
【发布时间】:2014-12-24 18:00:59
【问题描述】:

这是关于 C 语言中的信号量编程的。

    sem_t mutex;
    .
    .
    int main()
    {
        sem_init(&mutex, 0, 1);
        .
        .
        .
        .
        sem_destroy(&mutex);
        return 0;
    }

如果我没有在我的最后一个程序中使用 sem_destroy(),它可能会导致什么影响?

【问题讨论】:

  • 听说会导致内存泄漏,会多了解并解答。
  • 鉴于您提到了sem_destroy,我们是在谈论用 C 编写的程序吗?

标签: memory-management operating-system semaphore


【解决方案1】:

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

在使用之前,必须初始化一个未命名的信号量 使用 sem_init(3)。然后可以使用 sem_post(3) 和 sem_wait(3)。当信号量不再 需要,并且在它所在的内存之前 释放,信号量应该使用销毁 sem_destroy(3)。

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

一个未命名的信号量应该在之前用 sem_destroy() 销毁 它所在的内存被释放。未能做到这一点 可能会导致某些实现的资源泄漏。

对于命名信号量,情况有所不同(它们位于/dev/shm/)。我猜想 thread-shared 信号量可能会在其内存段被删除时被破坏(不再被任何进程映射)。我不确定这一点,它是特定于实现的行为,所以不要依赖这个。

也可以使用proc(5)

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

避免undefined behavior

【讨论】:

  • 好吧,你的意思是除非我销毁信号量,否则分配给程序的资源不会被释放?
  • 是的,可能会发生(或者可能不会发生!)。确切的行为是未定义的,并且是特定于实现的。
【解决方案2】:

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

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

【讨论】:

  • 什么问题,这是问题。
猜你喜欢
  • 2019-06-05
  • 2012-09-28
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多