簡體   English   中英

std::thread 成員 object 在終止時崩潰

[英]std::thread member object crashes on destruction in terminate

我有一個程序,我想在一個單獨的線程中運行我的一個類,其優先級高於程序的 rest,我希望它在處理時更新 GUI,所以我使用std::thread

圖形用戶界面.h

#include <thread>

class GUI
{
private:
   Worker worker;

   std::thread workerThread;

public:
   GUI ();
   ~GUI ();

   void runWorker ();
}

圖形用戶界面.cpp

GUI::GUI ()
{
}

GUI::~GUI()
{
}

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

工人.h

class Worker
{
public:
   void run ();
}

工人.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::thread中的std::terminate中崩潰。

這是一個問題,因為std::thread不再存在,因為 Worker 已經完成了嗎? 如果Worker::run已經完成,如何防止 GUI 析構函數調用std::thread析構函數?

如果 std::thread 管理線程,則 std std::thread將在銷毀時使用std::terminate()
根據您的需要,調用.join().detach()以有序結束。

或者升級到 C++20,它引入了加入而不是終止的std::jthread

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM