【问题标题】:Clean up after killing a thread杀死线程后清理
【发布时间】:2019-12-19 16:05:47
【问题描述】:

看完这篇文章https://developer.ibm.com/tutorials/l-memory-leaks/我想知道有没有办法取消线程执行并避免内存泄漏。因为我的理解是连接功能正在释放分配的空间。其他命令也应该可以做到这一点。我感兴趣的事情是如何连接释放内存空间和其他功能不能?是否有一个函数可以为女巫线程分配内存空间?这可以给出(映射)吗?我知道人们不应该对此做疯狂的事情,因为它代表了潜在的安全问题。但是还有办法实现吗?

【问题讨论】:

  • 我不确定你到底在问什么。当然,还有很多其他方法可以做到这一点。如果像pthread_join 这样的功能不能完全按照您的意愿使用,请不要使用它们并以其他方式管理它。您可以使用pthread_cancel 编写可取消的代码,或者,如果这不合适,也可以使用您想要的任何其他机制。只编写你想要的代码有什么问题?
  • @Mr. Schwartz,我要解决的问题非常大。例如,如果我有第三方库,那么我可以识别它的线程,但我无法识别库中分配的内存空间,或者我不知道该怎么做(库是二进制文件)。编码这样的东西是一个兔子洞,应该在操作系统级别完成。 Posix 允许取消但不识别单个线程,并且并非所有 Posix 功能都适用于 linux。 Posix 只是操作系统中 stl 的一层。
  • 我的想法是,在 Linux 的某个地方,如果启用了某个选项,系统会跟踪线程在堆上进行的分配,因为我知道默认情况下没有任何内容。但我看到一个严肃的问题没有答案。

标签: linux-kernel multithreading memory-leaks pthreads


【解决方案1】:

例如,如果我有一个第三方库,那么我可以识别它的线程,但我无法识别库中分配的内存空间,或者我不知道该怎么做(库是二进制文件) .

如果库不支持,你就不能。你对这个问题的理解略有偏差。谁分配了内存并不重要,重要的是内存是否仍然需要分配。如果库提供了某种方式来达到不再需要分配内存的程度,那么提供的方式也将提供一种释放内存的方式。如果库没有提供任何方法来达到不再需要分配内存的程度,那么某种释放它的方法将无济于事。

编码这样的东西是一个兔子洞,应该在操作系统级别完成。

做不到。操作系统无法知道分配一些内存的代码何时仍需要它,何时不需要。只有分配内存的代码才可能知道。

Posix 允许取消但不能识别单个线程,并且并非所有 Posix 功能都适用于 linux。 Posix 只是操作系统中 stl 的一层。

是的,所以 POSIX 不是这个地方。它需要了解应用程序,因此必须在应用程序层完成。如果您需要此功能,请对其进行编码。如果您在其他人的代码中需要它并且他们不提供它,请与他们交谈。据推测,如果他们的代码是体面和适当的,它有一些方法可以满足您的需求。如果没有,您的抱怨是代码不能满足您的需求。

我的想法是,在 Linux 的某个地方,如果启用了某个选项,系统会跟踪线程在堆上进行的分配,因为我知道默认情况下什么都没有。

这没有帮助。哪个线程分配的内存绝对不会告诉您何时不再需要它。只有确定需要它的相同代码才能判断何时不再需要它。因此,如果在某些分配内存的代码中需要这样做,则该代码必须实现这一点。如果实现该代码的人没有提供这种设施,那么这意味着他们认为不需要它。您可能想问他们为什么做出这个决定。他们的回答可能会让您大吃一惊。

但我看到一个严肃的问题没有答案。

答案是编写您需要的代码。如果它是别人的代码并且他们没有编码,那么他们认为你不需要它。他们很可能是对的。但如果他们错了,就不要使用他们的代码。

【讨论】:

  • 好的,这让我确认了我最担心的事情。问题是成本越来越高(冗长而令人讨厌的故事)。我了解您关于跟踪代码分配的想法。但我的想法只适用于我必须取消线程的情况。我知道是否有其他代码需要内存分配,这需要解决。问题是,如果我现在说我的团队需要这个功能列表,这将产生成本和时间问题(许多供应商),这就是为什么我首先提出这个问题,因为有很多人在创建各种解决方案。我的下一个目标是分叉。
  • @MarkoBencik 为什么不将库包装在自己的进程中?或者与图书馆作者/供应商联系,了解支持哪些形式的取消?但是,如果代码没有被设计成完全可取消,你就不能神奇地让代码完全可取消。
  • @Mr.施瓦茨,这是我想避免的情况。但是我看到我必须将应用程序的概念更改为多进程,然后将取消解决为定义的状态机。具有已知行为。谢谢回复。
猜你喜欢
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 2014-10-24
  • 2016-07-10
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多