C++ 标准螺纹分离
举一个简单的例子:C++ 标准螺纹分离,c++,std,C++,Std,举一个简单的例子: #include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::sleep_for #include <chrono> // std::chrono::seconds void new_thread(int n) { std::this_thread::sleep_for(std::
#include <iostream> // std::cout
#include <thread> // std::thread, std::this_thread::sleep_for
#include <chrono> // std::chrono::seconds
void new_thread(int n) {
std::this_thread::sleep_for(std::chrono::seconds(n));
std::cout << "New thread - exiting!\n";
}
int main() {
std::thread (new_thread, 5).detach();
std::cout << "Main thread - exiting!\n";
return 0;
}
#包括//std::cout
#包括//std::thread,std::this\u thread::sleep\u for
#包括//标准::计时::秒
无效新螺纹(int n){
std::this_thread::sleep_for(std::chrono::seconds(n));
std::coutdetach
将线程与主线程分离。是否要使用join()
将执行线程与线程对象分离,允许
执行将独立继续。任何分配的资源都将
线程退出后释放
After calling detach *this no longer owns any thread.
From调用线程意味着您不再关心该线程做什么。如果该线程在程序结束之前(当main
返回时)没有完成执行,那么您将看不到它的效果
但是,如果调用线程的长度足以让分离的线程完成,那么您将看到输出
[basic.start.main]/5在main
中的返回语句具有离开main函数的效果(销毁任何具有自动存储持续时间的对象)并以返回值作为参数调用std::exit
。如果控件从main
的复合语句末尾流出,则效果相当于操作数为0的return
[support.start.term]/9
[[noreturn]]无效退出(int状态);
效果:
- 最后,将控件返回到主机环境
您似乎期望当main
返回时,程序等待所有线程完成—实际上,隐式连接所有分离的线程。事实并非如此—相反,程序终止,操作系统清理分配给进程的资源(包括任何线程).你期望detach
做什么?你所描述的与join
比detach
更相似detach
就像“我不再关心线程,我不会等它完成”当应用程序终止时,所有线程都会停止。@Eljay我已经更新了我的问题。你现在能友好地回答它吗?你的新问题不能用线程完成。它可以用fork
完成,但这取决于操作系统。好吧,但是这样分离的线程怎么了?为什么它不能作为分离的“程序”运行打印?该线程不会发生任何事情。就程序而言,该线程会消失。如果有任何资源需要清理,操作系统会这样做。因此,当主调用线程完成时,被调用线程会自动销毁所有资源,这就是为什么我们没有从该子线程获得任何输出?我已更新我的问题。你现在能这么友好地回答吗?你说:“允许独立执行”但是当主线程调用tread finish时,生成的线程也被杀死了?我已经更新了我的问题。你现在能很好地回答它吗?再一次-一旦main
返回,调用exit
,进程终止;不再运行任何线程。如果你想让第二个线程完成,main
必须继续运行il它完成了。最简单的方法是main
连接第二个线程,而不是detach
它。这个显而易见的简单解决方案以什么方式不能满足您的要求?听起来像是一个