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::thread
将 std::terminate()
销毁。
调用.join()
或.detach()
有序结束,看你需要什么。
或者升级到 C++20,它引入了 std::jthread
连接而不是终止。
我有一个程序,我想在一个单独的线程中 运行 我的 类 之一,优先级高于程序的其余部分,我希望它更新 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::thread
将 std::terminate()
销毁。
调用.join()
或.detach()
有序结束,看你需要什么。
或者升级到 C++20,它引入了 std::jthread
连接而不是终止。