【问题标题】:Does detached thread leaks memory C++ after exit退出后分离的线程是否泄漏内存C++
【发布时间】:2020-12-04 07:57:22
【问题描述】:

我有一个用例,我必须从自身内部停止线程。所以我想把它拆开,一旦调用 stop 方法(这将完成线程的执行)。

那么它在分离后会泄漏内存吗?如果有,应该如何处理?

【问题讨论】:

  • 分离线程和可能泄漏内存的线程相互正交。
  • 我的意思是问,分离的线程什么时候释放资源。如果它根本不发布会怎样?

标签: c++ multithreading c++11 memory-leaks detach


【解决方案1】:

除非线程实际退出(例如returns),否则无法“停止”分离的特定线程,因此这取决于您的意思。至少,这对于标准 C++ 线程是不可能的。

如果你问returns 的线程是否会自动清理资源,答案是否定的——不会。任何在其析构函数中清理资源的 RAII 对象都将被调用,但任何显式分配的内容都不会被清理,并且需要代码手动执行此操作。

如果您正在考虑pthread_cancel 之类的东西,那么它很可能不会被清理,因为这是一个 C API,并且取消不会插入执行析构函数清理的return。我强烈建议不要做这种事情。

如果从线程“停止”实际上是指std::exit 之类的东西,那么这取决于您使用的底层操作系统。不会运行析构函数,因此不会执行任何特定的清理代码;然而,在大多数现代操作系统上,任何使用过的资源(如开放内存)都会在程序终止时被清理。但是,有些系统不这样做(通常是专用/嵌入式 RTOS)


防止任何类型的分离线程泄漏的最佳方法是能够在您希望它完成时向它发出信号,并始终使用 RAII 对象以便自动清理。

使用,您实际上可以为此使用std::stop_token,但在此之前,您可以简单地从std::shared_ptr<std::atomic<bool>> 设计一个同步系统,并在线程中将其作为“取消点”进行查询。

【讨论】:

  • From : cplusplus.com/reference/thread/thread/detach """将对象所代表的线程从调用线程中分离出来,允许它们彼此独立执行。两个线程继续运行而不会阻塞,也不会以任何方式同步。注意当任何一个结束执行时,它的资源就会被释放。""" 表示,资源在执行过程中被释放。这是什么意思 ?我的用例是,我想明确地停止一个线程,所以我正在做 detcah() + return。这看起来对吗?
  • 那一点是指thread_local 数据和线程对象本身(它是系统资源)。只要线程正确返回最终,并且代码中的所有其他内容都没有泄漏(例如,没有裸new 调用,请始终使用容器、智能指针等RAII 类型),那么你应该没问题。
  • 不会涵盖的内容是,如果您要在线程函数中执行auto* p = new int; return 之类的操作,因为此内存不会是deleted,而是泄漏。或者类似地,如果该线程打开了一个套接字或文件,但未能关闭它。线程将自动处理的唯一资源是线程资源;但是任何进行手动资源管理的东西都不会自动清理
猜你喜欢
  • 2015-10-05
  • 2014-06-08
  • 1970-01-01
  • 2020-08-08
  • 2012-01-07
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多