从具有本地 std::thread 对象而不连接的函数退出

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

本文关键字:不连接 函数 退出 对象 thread std      更新时间:2023-10-16

我有以下简单的函数,仅用于演示:

void thread_func(int i) {
    return i;
}

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

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

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

有理由担心吗?即使从my_nice_function()返回,如何让线程t后台运行?

您的关注是有道理的。阅读合适的std::thread参考文档告诉我们,关于销毁:

如果*this有一个关联的线程(joinable() == true),则调用std::terminate()

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

因此,您有两种选择,具体取决于您想要发生的事情。如果希望函数等待线程完成,请在返回之前调用t.join()。如果希望线程在函数返回后继续运行,请调用 t.detach()

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

t.join ()

如果您希望 main 函数等到线程函数的执行完成,则应编写此代码。或

t.detach ()

如果您希望线程函数独立运行,则应调用此函数,我的意思是主函数。 不应等待它完成。

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

参考:如何销毁线程对象