即发即弃 std::线程对象清理自身

Fire-and-forget std::thread objects cleaning themselves up

本文关键字:线程 std 对象      更新时间:2023-10-16

在实现服务等时,可能需要即发即弃功能,即创建线程并将其留给自己的设备。但是,需要将std::thread对象保留在某个地方以防止它超出范围,但是当线程完成时,没有整洁的delete this支持,即使有,对于非指针分配来说,这也将是一个问题。同样,更高级别的库可能具有Timer对象,其中一次性计时器可能会触发,但完成后需要清理。

人们也许可以保留std::threadTimer对象的集合,并且每隔一段时间就会浏览列表并删除完成的对象,但这似乎很麻烦。有没有一些有用的成语来管理这些类型的临时人员?

我的直接解决方案是结合使用std::mutexstd::atomic来让我的服务返回BUSY所以我只有一个线程,但这感觉就像代码气味

这就是 std::thread::d etach(( 的用途——如果你想让线程"即发即忘",那么在创建它之后调用它detach。 这会导致 std:thread 对象不再引用实际的执行线程,因此您可以销毁 std::thread,并且对执行没有影响。

如果有很多即发即弃功能,您可以考虑使用Thread Pool.创建和销毁线程有开销,其中很多可能会占用 RT 中的 RAM。 线程池为您启动 X 个线程为您服务,它将为您管理每个"即发即弃"线程。

一个简单的线程池,为我解决问题。

std::mutex与管理线程的资源无关,它与同步线程有关。