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,它加入而不是终止。