std::thread 成员对象在终止销毁时崩溃

std::thread member object crashes on destruction in terminate

我有一个程序,我想在一个单独的线程中 运行 我的 类 之一,优先级高于程序的其余部分,我希望它更新 GUI进程,所以我正在使用 std::thread.

GUI.h

#include <thread>

class GUI
{
private:
   Worker worker;

   std::thread workerThread;

public:
   GUI ();
   ~GUI ();

   void runWorker ();
}

GUI.cpp

GUI::GUI ()
{
}

GUI::~GUI()
{
}

void GUI::runWorker()
{
   workerThread = std::thread (&Worker::run, worker);
}

Worker.h

class Worker
{
public:
   void run ();
}

Worker.cpp

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;
      }
   }
}

我的问题是 Worker::run 是否干净地完成,或者如果有异常它会结束,当我尝试为 GUI 调用析构函数时它在 std::terminate 中崩溃 std::thread

这是一个问题,因为 std::thread 不再存在,因为 Worker 已经完成了吗?如果 Worker::run 已经完成,如何防止 GUI 析构函数调用 std::thread 析构函数?

如果管理线程,

std::threadstd::terminate() 销毁。
调用.join().detach()有序结束,看你需要什么。

或者升级到 C++20,它引入了 std::jthread 连接而不是终止。