Memory management 如果在C中没有对信号量调用sem_destroy(),会发生什么?

Memory management 如果在C中没有对信号量调用sem_destroy(),会发生什么?,memory-management,operating-system,semaphore,Memory Management,Operating System,Semaphore,这是关于C语言中的信号量编程 sem\t互斥体; . . int main() { sem_init(&mutex,0,1); . . . . sem_销毁(和互斥); 返回0; }它是特定于操作系统的。在Linux上,阅读;事实上,你是在一个未指明的情况。然而,文件说 在使用之前,必须初始化未命名的信号量 使用sem_init(3)。然后,可以使用 sem_post(3)和sem_wait(3)。当信号量不再是 必需,并且在其所在的内存 如果取消分配,则应使用 扫描电镜(3) 因此您应该在适

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

sem\t互斥体;
.
.
int main()
{
sem_init(&mutex,0,1);
.
.
.
.
sem_销毁(和互斥);
返回0;

}
它是特定于操作系统的。在Linux上,阅读;事实上,你是在一个未指明的情况。然而,文件说

在使用之前,必须初始化未命名的信号量 使用sem_init(3)。然后,可以使用 sem_post(3)和sem_wait(3)。当信号量不再是 必需,并且在其所在的内存 如果取消分配,则应使用 扫描电镜(3)

因此您应该在适当的时候调用
sem\u destroy
;不要冒全系统资源泄漏的风险。顺便说一句,以下文件:

未命名的信号量应在之前使用sem_destroy()销毁 它所在的内存被解除分配。没有做到这一点 可能导致某些实现上的资源泄漏

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

也使用

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


避免

这是特定于操作系统的。在Linux上,阅读;事实上,你是在一个未指明的情况。然而,文件说

在使用之前,必须初始化未命名的信号量 使用sem_init(3)。然后,可以使用 sem_post(3)和sem_wait(3)。当信号量不再是 必需,并且在其所在的内存 如果取消分配,则应使用 扫描电镜(3)

因此您应该在适当的时候调用
sem\u destroy
;不要冒全系统资源泄漏的风险。顺便说一句,以下文件:

未命名的信号量应在之前使用sem_destroy()销毁 它所在的内存被解除分配。没有做到这一点 可能导致某些实现上的资源泄漏

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

也使用

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


避免

如果不使用sem\u destroy,存储信号量的地址将保存信号量的最后一个值


这可能会导致问题,因为信号量的前一个值可能指示进程仍在运行,即使它不是

如果不使用sem\u destroy,存储信号量的地址将保存信号量的最后一个值


这可能会导致问题,因为信号量的前一个值可能指示进程仍在运行,即使它不是

我听说它会导致内存泄漏,我会找出更多的答案。鉴于你提到的
sem\u destroy
,我们是在谈论用C编写的程序吗?我听说它会导致内存泄漏,我会找出更多的答案。鉴于你提到的
sem\u destroy
,我想知道更多的答案,我们讨论的是用C语言编写的程序吗?什么问题,这是个问题。什么问题,这是个问题。好吧,你的意思是,除非我销毁信号量,否则分配给程序的资源不会被取消分配?是的,可能会发生(或者可能不会发生!)。确切的行为是未定义的,并且是特定于实现的。那么,您的意思是,除非我销毁信号量,否则分配给程序的资源不会未分配?是的,可能会发生(或者可能不会发生!)。确切的行为尚未定义,并且是特定于实现的。