从内部线程函数释放std :: thread

时间:2019-04-15 20:38:33

标签: c++ multithreading c++11

典型的工作线程是这样的:

std::thread t([](){

  ....
 });
t.join();

是否可以从线程函数内部分离线程(因此应该返回join)?因此,线程被“分离”并且t.join()之后的代码继续运行,并且线程函数也继续运行。

我可以在Windows中使用SetEvent做到这一点,但我正在寻找一种标准的解决方案。

1 个答案:

答案 0 :(得分:0)

操作方法

线程运行的函数需要具有对该线程的引用。如果它具有对该线程的引用,则可以仅对该引用调用detach

有两种方法可以使用lambda。

通过引用捕获线程。我们可以让传递给线程的lambda通过引用捕获线程本身:

std::thread myThread([&]() {
    myThread.detach(); 
}); 

将线程作为输入传递给lambda。

我们可以将引用传递给用于启动线程的函数,如下所示:

auto myFunc = [](std::thread& myThread) {
    myThread.detach(); 
};

// Pass a reference to yourself:
std::thread t(myFunc, std::ref(t)); 

在这里,我们将对线程的引用传递给myFunc,一旦启动,线程就将其分离。我们必须使用来自std::ref的{​​{1}},因为线程会复制用于启动它们的参数的副本,除非这些参数作为reference_wrapper传递。

使用<utility>防止线程对象在调用std::shared_ptr之前脱离作用域

仅当线程最终执行时detach仍在作用域内时,这些方法才有效。如果myThread超出范围,这将使引用无效,并可能导致程序崩溃。

我建议使用类似myThread之类的方法来解决此问题:

shared_ptr