退出后分离线程是否泄漏内存C ++

问题描述

我有一个用例,其中我必须从自身内部停止线程。因此,我正在考虑将其分离,然后调用stop方法(它将完成线程的执行)。

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

解决方法

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

如果您问return的线程是否会自动清理资源,答案是否定的-不会。任何会清理其析构函数中的资源的RAII对象都将被调用,但是任何明确分配的对象都不会被清理,并且需要代码来手动完成。

如果您想到的是pthread_cancel之类的东西,则很有可能不会被清理,因为这是C API,并且取消操作不会插入return执行析构函数清理。我强烈建议您不要做这种事情。

如果实际上通过“停止”线程来表示std::exit之类的东西,则这取决于您所使用的基础操作系统。析构函数将不会运行,因此将不执行任何特定的清理代码。但是,在大多数现代OS上,程序终止时会清除所有已使用的资源(如开放内存)。但是,有一些系统不这样做(通常是专用/嵌入式RTOS)


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

实际上,您可以使用来使用std::stop_token,但是在此之前的任何事情中,您都可以简单地从std::shared_ptr<std::atomic<bool>>设计一个同步系统,并在线程中以“取消”的方式进行查询。点”。