Thread 对象在创建后立即销毁自身?

Thread object destroys itself immediately after creation?

我创建了一个 class、PrimaryThread 来处理我应用程序在主线程之外的大部分工作,它不会受到需要在主线程上工作的代码的干扰,并且可能会阻塞。我在堆栈 main() 内创建了 PrimaryThread 对象,然后...它立即销毁了自己。

这是我的 main() 函数:

int main(int, char**)
{
    Main::running = true;
    cout << "Hello World!\n";

    Config config("config.ini");
    Window window(&config);
    PrimaryThread(&config, &window);
    cout << "  blah\n";

    while(Main::isRunning())
    {
        window.handleMessages();
    }

    cout << "Goodbye World!\n";
    return 0;
}

这里是 PrimaryThread class 的构造函数和析构函数:

PrimaryThread(Config* config, Window* window)
:   _primaryThread(main, this),
    _config(config),
    _window(window)
{
    if (!_primaryThread.joinable())
    {
        std::cerr << "!Failed to initialize primary thread!\n";
        Main::shutDown();
    }
}

~PrimaryThread()
{
    std::cout << "Destructing PrimaryThread class.\n";
    Main::shutDown();
    _primaryThread.join();
}

PrimaryThread::_primaryThread是一个私有变量,一个std::thread(不是指针,所以分配在栈上)。 PrimaryThread::main()是私有方法,其地址传递给_primaryThread的构造函数。它确实正确构建并 运行 线程。

PrimaryThread::main 内的循环依赖于 Main::isRunning(),在任何线程调用 Main::shutDown() 后 returns 为 false。如果我注释掉该行,线程会正确循环,但主线程陷入永远不会结束的冻结状态,因为 _primaryThread.join() 阻止它,并且无法接收输入(输入在 window.handleMessages() 中处理, 在主线程上), 主线程永远不会从循环中中断。

在不注释任何行的情况下,我的控制台最终看起来像:

Hello World!
Window opened. // Window::Window(), on main thread
Destructing PrimaryThread class.
Primary thread started // PrimaryThread::main(), on primary thread
primary thread shutting down // as above
  blah
Goodbye World!
Window closed. // Window::~Window(), on main thread

如果我在析构函数中注释掉 _primaryThread.join(),我就会崩溃。我不知道为什么,我使用的调试器无法跟踪它,我的控制台显示:

terminate called without an active exception

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

...然后是过程returns 3.

这到底是怎么回事?

PrimaryThread(&config, &window); 创建一个未命名的临时 PrimaryThread 对象,该对象在 ;.

处销毁