gpt4 book ai didi

c - 多线程 C 应用程序应如何处理失败的 malloc()?

转载 作者:太空狗 更新时间:2023-10-29 16:54:06 25 4
gpt4 key购买 nike

我正在处理的应用程序的一部分是一个简单的基于 pthread 的服务器,它通过 TCP/IP 套接字进行通信。我用 C 编写它,因为它将在内存受限的环境中运行。我的问题是:如果其中一个线程遇到返回 NULL 的 malloc(),程序应该怎么办?到目前为止我想到的可能性:

  1. 无特殊处理。让 malloc() 返回 NULL 并取消引用它,这样整个事情就会出现段错误。
  2. 通过调用 abort() 或 exit(-1) 在失败的 malloc() 上立即退出。假设环境会清理一切。
  3. 跳出主事件循环,尝试pthread_join()所有线程,然后关闭。

第一个选项显然是最简单的,但似乎非常错误。第二个似乎也是错误的,因为我不知道到底会发生什么。第三个选项看起来很诱人,但有两个问题:第一,在正常情况下不需要将所有线程都加入到主线程中;第二,为了完成线程执行,大多数剩余线程将不得不调用 malloc( ) 无论如何。

我该怎么办?

最佳答案

这是 space / rad hard systems 的原因之一一般禁止动态内存分配。当 malloc() 失败时,很难“治愈”失败。您确实有一些选择:

  • 您不需要使用内置的 libc malloc()(根本不需要,或者像往常一样)。你可以wrap malloc()对失败做额外的工作,例如通知其他事情。这在使用看门狗之类的东西时很有用。您还可以使用 full blown garbage collector ,虽然我不推荐它。最好识别并修复漏洞。
  • 根据存储和复杂性,不常访问的分配 block 可以映射到磁盘。但在这里,通常情况下,您只关注物理内存中几 KB 的节省。
  • 您可以使用静态内存池和您自己的 malloc(),不会超卖它。如果您已广泛分析堆使用情况(使用 Valgrind 的 massif 或类似工具),您可以合理调整池的大小。

但是,如果失败不是一种选择,那么大多数这些建议归结为不信任/不使用系统 malloc()

在您的情况下,我认为您能做的最好的事情是让确保malloc() 失败的情况下通知看门狗,以便您的进程 (或整个系统)可以重新启动。您不希望它在陷入僵局时看起来“活跃并正在运行”。这可能就像取消链接文件一样简单。

写非常详细的日志。失败发生在什么文件/行/函数?

如果 malloc() 在尝试获取几 KB 时失败,这是一个好兆头,表明您的进程无论如何都无法可靠地继续。如果抓取几百 MB 失败,您可以恢复并继续。因此,您采取的任何操作都应基于您尝试获取的内存量,以及分配更小内存的调用是否仍然成功。

你永远不想做的一件事就是对 NULL 指针进行操作并让它崩溃。它只是马虎,没有提供有用的错误记录,并且给人的印象是您的软件质量低/不稳定。

关于c - 多线程 C 应用程序应如何处理失败的 malloc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2833744/

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