退出具有本地 std::thread 对象但未连接的函数

Exiting from a function that has a local std::thread object without join

我有以下简单功能,仅供演示:

void thread_func(int i) {
    return i;
}

我还有另一个函数在新线程中调用它并且不等待它 return:

void my_nice_function() {
    std::thread t(thread_func, 15);
}

由于tmy_nice_function()中的局部变量,我担心my_nice_function()退出时,t会在运行ning时被销毁。

有理由担心吗? 我怎样才能让线程 t 运行 即使在从 my_nice_function() 进入 return 之后仍处于后台?

您的担心是有道理的。阅读合适的 reference documentation for std::thread 告诉我们在销毁时:

If *this has an associated thread (joinable() == true), std::terminate() is called.

因此,在不分离或加入的情况下销毁 t 将结束您的程序。

因此,您有两种选择,具体取决于您希望发生什么。如果您希望函数等待线程完成,请在返回前调用 t.join()。如果您希望线程在函数 returns 之后保留 运行,请调用 t.detach().

是的,这是一个令人担忧的原因。该代码将无法按预期工作。你可以做

t.join ()

如果你想让你的主函数等到线程函数的执行,就应该这样写。完成了。 或者

t.detach ()

如果你想要线程函数,应该调用它。到 运行 独立,我的意思是主要功能。不应该等待它完成。

你也可以使用睡眠(x)。如果您希望函数 运行 仅 x 秒。 通常不建议调用 terminate(),因为它会杀死所有线程,包括 main () 线程。没有必要杀死一个线程。当线程中的函数 运行ning 完成时,线程会自动清理自身。

参考这个: