从具有本地 std::thread 对象而不连接的函数退出
Exiting from a function that has a local std::thread object without join
我有以下简单的函数,仅用于演示:
void thread_func(int i) {
return i;
}
我还有另一个函数可以在新线程中调用它并且不等待它返回:
void my_nice_function() {
std::thread t(thread_func, 15);
}
由于t
是my_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 完成时,线程会自动清理自身。
参考:如何销毁线程对象
相关文章:
- 为什么使用SFINAE而不是函数重载
- 回溯C++不打印函数,因此文件
- () 函子后面的括号,而不是函数指针?
- 程序不向函数返回值
- LLVM 选择找不到函数传递
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 在这种情况下,如何传递成员函数而不是函数?
- 提升堆栈跟踪不显示函数名称和行号
- C++线程找不到函数作为参数(链接器)
- 调用参数排列不变函数 f(i++, i++)
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- Rcpp:在 R 中调用 c++ 函数而不导出 c++ 函数
- C++将 lambda 函数另存为成员变量,而不使用函数指针进行优化
- C26486 - 不向函数传递可能无效的指针?
- 如何使用boost::hana::unpack和构造函数,而不是函数
- Wt 连接函数,将参数传递给作为连接函数参数的函数
- 从具有本地 std::thread 对象而不连接的函数退出
- QT连接在构造函数中不连接
- 我自己的连接函数不会更改目标字符串