如果我在最后的程序中不使用sem_destroy,它可能会导致什么影响?会发生一些严重的问题吗?如果我不摧毁信号量会发生什么?
回答
它是特定于操作系统的。在Linux上,请阅读sem_overview(7);实际上你是处于一个不确定的情况。然而,文件说,
的使用前,一位不愿透露姓名信号必须使用sem_init初始化 (3)。然后可以使用 sem_post(3)和sem_wait(3)进行操作。当信号量不再需要 ,并且在其所在的存储器被解除分配之前,应该使用 sem_destroy(3)销毁信号量。
所以你应该叫sem_destroy
在适当的时候;不要冒全系统资源泄漏的风险。顺便说一句的sem_destroy(3)文档讲述:
的未命名信号应与 在其所位于被释放存储器前sem_destroy()被破坏。如果不执行此操作,可能会导致某些实现出现资源泄漏。
对于命名为信号灯,情况就不同了(他们坐在/dev/shm/
)。我想线程共享信号可能会被删除,当其内存段被删除(不再有任何进程映射)。我不确定这一点,它是特定于实现的行为,所以不要依赖于此。
也使用proc(5)。
那么可以发生是全系统resource leak,你不想要它。您可能需要重新启动才能将其删除。顺便说一下,你可以使用strace(1)找出涉及的实际系统调用,并且可以查看GNU glibc(或其他一些libc,如musl-libc)的源代码 - 也许可以是Linux内核 - 以了解更多实现特定行为。
好吧,你的意思是分配给程序的资源不会被分配,除非我销毁信号量? – Mike3162114 2014-10-29 06:25:08
是的*可能会发生(或可能不会!)。确切的行为是未定义的,并且是特定于实现的。 – 2014-10-29 06:28:42
其中旗语存储,如果你不使用sem_destroy将持有信号量的最后一个值的地址...
这可能会导致问题,因为信号灯的前值可能表明一个过程仍在运行,即使不是这样 !
什么问题,这就是问题所在。 – Mike3162114 2014-10-29 06:20:03
- 1. Qt:如果你发送信号太快会发生什么?
- 2. 未能获得信号量的线程会发生什么?
- 3. DatastoreService批量删除。如果发生异常,会发生什么
- 4. 当我滚动时摧毁效果
- 5. 摧毁大多数会话
- 6. 部队摧毁Servlet会话
- 7. “摧毁”不生产 - Rails应用程序
- 8. 如果我不打电话给session_start(),会发生什么?
- 9. 如果我不取消上下文会发生什么?
- 10. 如果我不直接调用willMoveToParentViewController&didMoveToParentViewController,会发生什么?
- 11. 如果我们不进行软件测试会发生什么
- 12. 如果我不处理音频中断会发生什么?
- 13. 如果我不'删除'会发生什么?
- 14. 如果我不指定targetFramework =“4.0”,会发生什么情况?
- 15. 如果我在链接时不使用-g,会发生什么
- 16. 如何摧毁PHP
- 17. 如何摧毁确切的会议
- 18. 如何跳过协会回调摧毁
- 19. 如果我把不可用的值放在JavaScript变量中会发生什么?
- 20. 如果主从站无法通信会发生什么?
- 21. 如果HttpClient.execute()中断会发生什么?
- 22. 如果action =“”会发生什么?
- 23. Bootstrap工具提示和popovers:摧毁,或不摧毁?
- 24. 如果我的IExceptionPublisher引发异常,会发生什么情况?
- 25. exec上的挂起信号和信号掩码会发生什么?
- 26. 当std :: thread被销毁时,如果指针指向shared_ptr会发生什么?
- 27. 不能摧毁线程
- 28. 不能摧毁身体(Box2d)
- 29. Hibernate,如果beginTransaction不会被使用会发生什么?
- 30. 为什么说我的'摧毁堆'没有被宣布?
我听说它可能导致内存泄漏,会发现更多并回答它。 – 2014-10-29 05:44:21
鉴于你提到'sem_destroy',我们在谈论用C编写的程序吗? – 2014-10-29 05:46:34
试图找出RTFM的含义。 – 2014-10-29 06:08:21