如何解决std::thread 成员对象在终止时崩溃
我有一个程序,我想在一个单独的线程中运行我的一个类,该线程的优先级高于程序的其余部分,我希望它在处理过程中更新 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
,它加入而不是终止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。