退出具有本地 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);
}
由于t
是my_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 完成时,线程会自动清理自身。
参考这个:
我有以下简单功能,仅供演示:
void thread_func(int i) {
return i;
}
我还有另一个函数在新线程中调用它并且不等待它 return:
void my_nice_function() {
std::thread t(thread_func, 15);
}
由于t
是my_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 完成时,线程会自动清理自身。
参考这个: