问题描述
我有一个程序,我想在一个单独的线程中运行我的一个类,该线程的优先级高于程序的其余部分,我希望它在处理过程中更新 GUI,所以我使用 {{1} }.
GUI.h
std::thread
GUI.cpp
#include <thread>
class GUI
{
private:
Worker worker;
std::thread workerThread;
public:
GUI ();
~GUI ();
void runWorker ();
}
Worker.h
GUI::GUI ()
{
}
GUI::~GUI()
{
}
void GUI::runWorker()
{
workerThread = std::thread (&Worker::run,worker);
}
Worker.cpp
class Worker
{
public:
void run ();
}
我的问题是 void Worker::run ()
{
unsigned int numItems = 70;
for (unsigned int i = 0 ; i < numItems ; i++)
{
try
{
processItem (i);
}
catch (exception &e)
{
std::cout << "Error processing item " << i << std::endl;
break;
}
}
}
是否干净地完成,或者如果有异常它会结束,当我尝试调用 GUI 的析构函数时,它在 Worker::run
中的 std::terminate
中崩溃。>
这是一个问题,因为 std::thread
不再存在,因为 Worker 已经完成了吗?如果 std::thread
已经完成,如何防止 GUI 析构函数调用 std::thread
析构函数?
解决方法
std::thread
将在销毁时 std::terminate()
如果它管理一个线程。
根据您的需要,调用 .join()
或 .detach()
以有序结束。
或者升级到 C++20,它引入了 std::jthread
,它加入而不是终止。