#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;
}

在上面的代码中,当 main 退出时,"Print" 文本会在哪里消失,因为它没有输出流?是否有任何用于插入无用数据的虚拟流?

最佳答案

main 退出时,它调用 exit 终止所有线程,无论是否分离。这是因为 exit 终止了整个过程。
C++ 运行时将 main 作为 exit(main(argc, argv)) 运行,因此从 main 返回会导致调用 exit
如果您愿意,您可以通过调用 pthread_exit 来终止主线程。在这种情况下,主线程不会从 main 返回,也不会调用 exit 。应用程序将继续运行,直到某个其他线程调用 exit 或所有线程终止(或应用程序崩溃)。这就是它在 Linux 上的工作方式,不确定 Windows。std::cout 对象和其他标准流至少在调用 exit 之前可用。这些流使用 Schwarz Counter idiom 进行初始化,这确保它们在第一次使用之前被初始化并在最后一个用户消失后销毁。换句话说,如果您有一个带有构造函数和析构函数的全局对象,它在 main 输入之前被初始化并在(调用 exit 时)之后被销毁,那么该标准流仍将在该全局对象析构函数中可用。基本上,每个标准流都有一个引用计数器,每个翻译单元(目标文件)在启动时增加这个引用计数器,在终止时减少。
ISO/IEC 14882:2011(E) 说:

关于multithreading - 当 main 退出时,控制台输出去哪里了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30956795/

10-13 08:34