所以我碰到了一些似乎打败了std::thread
的目的,或者至少让它变得不方便。
假设我想生成一个std::thread
来执行一次任务,并且在此之后不想再担心它。我在函数末尾附近创建了这个thread
,所以std::thread
很快就会超出范围,在我的情况下,可能在thread
仍在运行时。这会产生一些问题(或者至少我所知道的)。
我可以:
A)使std::thread
成为一个全局变量,因此它不会超出范围。
B)在join()
上调用std::thread
,这会破坏产生线程的目的。
还有其他希望更好的方法来处理这种情况吗?
你想要的是std::thread::detach。
它解耦了实际的执行线程和std::thread
对象,允许你在不加入线程的情况下销毁它。
你可以使用std::async
。
async异步运行函数f(可能在一个单独的线程中,可能是线程池的一部分)并返回一个std :: future,最终将保存该函数调用的结果。
既然你没有提到你需要得到线程的结果,就没有必要得到未来。
正如评论中所指出的,std :: future的析构函数在任何情况下都会被阻塞,所以你必须将它移动到某个全局对象(并手动管理删除未使用的期货),或者你可以将它移动到本地范围内异步调用的函数。
其他首选选项是允许线程从任务队列中使用任务。为此,将作业拆分为任务块并提供给工作线程。要避免轮询,请选择condition_variable。
std::thread([&](){
while(running) // thread loop
{
// consume tasks from queue
}
}).detach();