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

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::thread 目的或至少使它不那么方便的东西。

假设我想产生一个 std::thread 来执行一次任务并且之后不想再担心它。我在函数末尾附近创建了这个 thread,因此 std::thread 很快就会超出范围,在我的例子中,很可能 thread 仍然是 运行。这会导致一些解决方案出现问题(或者至少我知道)。

我可以:

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

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

是否有其他更好的方法来处理这种情况?

您可以使用 std::async.

async 异步运行函数 f(可能在一个单独的线程中,它可能是线程池的一部分)和 returns a std::future 最终将保存该函数的结果函数调用。

既然你没有提到需要获取线程的结果,那么就不需要获取future了。

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

你要的是std::thread::detach

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

其他首选选项是允许线程使用任务队列中的任务。为此,将作业拆分为任务块并提供给工作线程。为避免轮询,请选择 condition_variable.

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