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

问题描述 投票:1回答:3

所以我碰到了一些似乎打败了std::thread的目的,或者至少让它变得不方便。

假设我想生成一个std::thread来执行一次任务,并且在此之后不想再担心它。我在函数末尾附近创建了这个thread,所以std::thread很快就会超出范围,在我的情况下,可能在thread仍在运行时。这会产生一些问题(或者至少我所知道的)。

我可以:

A)使std::thread成为一个全局变量,因此它不会超出范围。

B)在join()上调用std::thread,这会破坏产生线程的目的。

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

c++ multithreading c++11 stdthread
3个回答
3
投票

你想要的是std::thread::detach

它解耦了实际的执行线程和std::thread对象,允许你在不加入线程的情况下销毁它。


2
投票

你可以使用std::async

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

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

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


1
投票

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

std::thread([&](){
                    while(running) // thread loop
                    { 
                       // consume tasks from queue
                    }
                 }).detach();
© www.soinside.com 2019 - 2024. All rights reserved.