std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?

std::thread that isn't a global variable but doesn't go out of scope when the end of the function that created it is reached?

本文关键字:函数 范围 创建 全局变量 线程 std      更新时间:2023-10-16

所以我遇到了一些似乎违背std::thread目的或至少使其不那么方便的东西。

假设我想生成一个std::thread来执行一次任务,并且不想再担心它。我在函数末尾附近创建此thread,因此std::thread很快就会超出范围,就我而言,很可能在thread仍在运行时。这给几个解决方案(或者至少我知道(带来了问题。

我可以:

A( 使std::thread成为全局变量,这样它就不会超出范围。

B( 在std::thread上调用join(),这违背了生成线程的目的。

有没有其他希望更好的方法来处理这种情况?

你想要的是std::thread::d etach。

它将实际的执行线程和std::thread对象分离,允许您在不加入线程的情况下销毁它。

您可以使用std::async.

异步异步运行函数 f(可能在可能是线程池一部分的单独线程中(并返回最终将保存该函数调用结果的 std::future。

既然你没有提到你需要得到线程的结果,所以没有必要得到未来。

正如注释中指出的,std::future 的析构函数在任何情况下都会阻塞,因此您必须将其移动到某个全局对象(并手动管理未使用的期货的删除(,或者您可以将其移动到异步调用函数的本地范围内。

另一个首选选项是允许线程使用任务队列中的任务。为此,将作业拆分为任务 chuck 并馈送到工作线程。为避免轮询,请选择condition_variable。

std::thread([&](){
while(running) // thread loop
{ 
// consume tasks from queue
}
}).detach();