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::cout
detach
将线程与主线程分离。是否要使用
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
它。这个显而易见的简单解决方案以什么方式不能满足您的要求?听起来像是一个