程序中止或退出时是不是释放 pthread_mutex_t*?

Posted

技术标签:

【中文标题】程序中止或退出时是不是释放 pthread_mutex_t*?【英文标题】:pthread_mutex_t* release or not when program abort or exit?程序中止或退出时是否释放 pthread_mutex_t*? 【发布时间】:2012-10-06 09:03:01 【问题描述】:

分配的pthread_mutex_t*使用“malloc()”,当程序中止或退出时,需要释放吗? 如果不免费的话,会不会有问题? 只是我知道,当您的进程终止时,系统将回收内存。 pthread_mutex_t 可能效果不好?

就像这个问题:

我的程序(文本模式网络浏览器)正在动态分配内存。

当然,我会在运行时释放不需要的块。而且我会在正常终止之前释放所有内容 - 这样内存泄漏检查器就不会给我误报(并且在需要进行重大重构时保持灵活性)。

现在,我不做的是在异常终止之前释放内存。 (目前,我的程序在信号和 malloc/reallocs 失败后终止。)

我的问题是:你认为这种不好的风格吗?我应该在异常终止时释放吗?

【问题讨论】:

【参考方案1】:

我对所有这些“在正常终止时释放一切”(甚至是异常终止)的口号的看法是,通常情况下,弊大于利:

1) 操作系统已经经过数十亿用户的设计、测试和浸泡测试。它可以在停止任何内核上处于任何状态的每个线程后轻松释放所有剩余的分配内存。你能用你的用户代码做到这一点吗?不。

2) 你必须添加代码才能做到这一点。每次添加代码时,都可能会添加更多错误。除非您是操作系统,否则试图在繁忙的复杂多线程系统中释放所有分配的内存是一场噩梦。内存无处不在,在线程变量、队列等中,并且当前可能会或可能不会被一个或多个线程访问。所有权是不确定的并且不断变化。你会怎么做?

3) 您必须不断测试和扩展您的关机系统,以确保在更改/增强/升级后释放所有内存。

4) 不断检查线程中的“终止”标志等,以便线程可以在关闭时释放一些内存,这是额外的开销。

5) 许多库在关闭时不会释放所有内存。如果库是不透明/半透明的,您可能无法对其执行任何操作。

6) 如果一个线程抛出一个严重的异常,内存可能处于这样一种状态,试图从用户代码中释放它会导致其他线程出现更多异常。

7) 风险/回报 - 漂亮、干净的 Valgrind 输出与来自客户的电话/电子邮件“嘿,您的应用有时不会关闭,我们必须调用管理员来 kill-9/TaskManager 它”。

8) 过滤和统计 SO re 上的所有线程。 '无法停止我的线程以关闭我的应用'。

对于某些应用程序,不可避免的是某些线程可能必须在正常关闭时以结构化方式终止,例如。提交和关闭数据库连接,刷新和关闭文件。释放内存不属于该类别,即使是正常关机也是如此。

如果您的应用确实遇到了严重问题,您不应该尝试“清理”内存 - 您的应用已经很脏,需要报废并用新实例替换。

【讨论】:

以上是关于程序中止或退出时是不是释放 pthread_mutex_t*?的主要内容,如果未能解决你的问题,请参考以下文章

确保脚本在用户中止时退出

由于线程退出或 WCF 中的应用程序请求,I/O 操作已中止

RPM 中的中止/退出/返回宏

带有 Git 命令错误处理的 Powershell - 在来自外部程序的非零退出代码时自动中止

你如何干净地中止一个 Delphi 程序?

退出、中止、休眠以进行调试?