我创建了一个类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
是一个私有变量,std::thread
(不是指针,因此在堆栈上分配)。 PrimaryThread::main()
是一个私有方法,其地址被传递给_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.
这到底是怎么回事?
答案 0 :(得分:1)
PrimaryThread(&config, &window);
创建一个未命名的临时PrimaryThread
对象,该对象在;
被销毁。