[英]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.