gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:13:27 37 4
gpt4 key购买 nike

我创建了一个类 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 类的构造函数和析构函数:

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 是一个私有(private)变量,一个 std::thread(不是指针,所以分配在堆栈上)。 PrimaryThread::main()是私有(private)方法,其地址传递给_primaryThread的构造函数。它确实正确地构造和运行了线程。

PrimaryThread::main 中的循环依赖于 Main::isRunning(),它在任何线程调用 Main::shutDown()< 后返回 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.

...然后该过程返回 3。

这到底是怎么回事?

最佳答案

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

关于c++ - Thread 对象在创建后立即销毁自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30769723/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com