gpt4 book ai didi

memory-management - 如果不对 C 中的信号量调用 sem_destroy() 会发生什么?

转载 作者:行者123 更新时间:2023-12-02 21:22:28 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

Before being used, an unnamed semaphore must be initialized using sem_init(3). It can then be operated on using sem_post(3) and sem_wait(3). When the semaphore is no longer required, and before the memory in which it is located is deallocated, the semaphore should be destroyed using sem_destroy(3).

因此您应该在适当的时候调用sem_destroy;不要冒系统范围资源泄漏的风险。顺便说一句 sem_destroy(3) 的文档告诉:

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.

对于命名信号量,情况有所不同(它们位于/dev/shm/中)。我猜想当线程共享信号量的内存段被删除(不再被任何进程映射)时,它可能会被销毁。我不确定这一点,这是特定于实现的行为,所以不要依赖于此。

也可使用proc(5) .

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

避免 undefined behavior

关于memory-management - 如果不对 C 中的信号量调用 sem_destroy() 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26623461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com