Multithreading 当主控制器退出时,控制台输出到哪里? #包括 #包括 使用名称空间std; void func() { 对于(int i=0;i C++运行时运行 main 为“代码>退出(main(ARCC,ARGV))< />代码,以便从主< 返回导致退出>代码> < < /P>

Multithreading 当主控制器退出时,控制台输出到哪里? #包括 #包括 使用名称空间std; void func() { 对于(int i=0;i C++运行时运行 main 为“代码>退出(main(ARCC,ARGV))< />代码,以便从主< 返回导致退出>代码> < < /P>,multithreading,c++11,Multithreading,C++11,当main退出时,它调用exit终止所有线程,无论是否分离。这是因为exit终止整个进程 < > C++运行时运行 main 为“代码>退出(main(ARCC,ARGV))< />代码,以便从主< 返回导致退出>代码> < < /P> 如果愿意,可以通过调用pthread\u exit终止主线程。在这种情况下,主线程将不会从main返回,也不会调用exit。应用程序将继续运行,直到其他线程调用exit或所有线程终止(或应用程序崩溃).这就是它在Linux上的工作方式,但不确定Windows是否

main
退出时,它调用
exit
终止所有线程,无论是否分离。这是因为
exit
终止整个进程

< > C++运行时运行<代码> main <代码>为“代码>退出(main(ARCC,ARGV))< />代码,以便从<代码>主< <代码>返回导致<代码>退出>代码> < < /P> 如果愿意,可以通过调用
pthread\u exit
终止主线程。在这种情况下,主线程将不会从
main
返回,也不会调用
exit
。应用程序将继续运行,直到其他线程调用
exit
或所有线程终止(或应用程序崩溃).这就是它在Linux上的工作方式,但不确定Windows是否适用

std::cout
对象和其他标准流至少在调用
exit
之前可用。这些流使用进行初始化,确保它们在第一次使用之前初始化,并在最后一个用户离开后销毁。换句话说,如果您有一个带有构造函数和析构函数的全局对象,则ts在进入
main
之前初始化,并在(调用
exit
时)之后销毁,该标准流仍将在该全局对象析构函数中可用。基本上,每个标准流、每个翻译单元(对象文件)都有一个关联的引用计数器在启动时递增此参考计数器,在终止时递减

ISO/IEC 14882:2011(E)规定:

27.4标准iostream对象

27.4.1.2对象[标准流]在类
ios_base::Init
的对象第一次构造之前或期间,以及在任何情况下
main
主体开始执行之前†构造对象并建立关联。在程序执行期间,对象不会被销毁。包含在翻译单元中的结果应e就好像定义了一个具有静态存储持续时间的
ios_base::Init
实例一样。同样,整个程序的行为也应该像至少有一个具有静态存储持续时间的
ios_base::Init
实例一样

静态对象的构造函数和析构函数可以访问这些对象,从
stdin
读取输入,或将输出写入
stdout
stderr


“std::cout object和其他标准流在调用exit之前都是可用的”我想这仅仅是一个答案。嗯。如果
cout
被销毁,那么还有一个问题没有解决(1)在线程终止之前,(2)在调用exit之后,或者(3)如果顺序实际上是未定义的。(1)和(3)可能会产生有趣的结果…分离操作的定义不是又一次吗?一旦我分离了一个线程,为什么它会在主函数终止时退出。我没有在func内部使用任何main变量。因此,这也不是一个未定义的行为。有人可能会说,这告诉我们,既然在静态线程列表之前可能不存在,它在之后被清理。但是它没有我想要的那么明确。@dhke
std::cout
和其他使用schwarz计数器初始化的标准流。这意味着它们是在第一个用户之前创建的,在最后一个用户离开后销毁。换句话说,你必须努力让
std::cout
在你的手下销毁。
#include<iostream>
#include<thread>
using namespace std;
void func()
{
    for (int i = 0; i < 10000; i++)cout << "Print" << endl;
}

int main()
{
    thread t(func);
    t.detach();
    cout << "Exit" << endl;
    return 0;
}