典型的工作线程是这样的:
std::thread t([](){
....
});
t.join();
是否可以从线程函数内部分离线程(因此应该返回join
)?因此,线程被“分离”并且t.join()
之后的代码继续运行,并且线程函数也继续运行。
我可以在Windows中使用SetEvent做到这一点,但我正在寻找一种标准的解决方案。
答案 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