Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::线程成员对象在terminate中销毁时崩溃_C++_C++11_Stdthread - Fatal编程技术网

C++ std::线程成员对象在terminate中销毁时崩溃

C++ std::线程成员对象在terminate中销毁时崩溃,c++,c++11,stdthread,C++,C++11,Stdthread,我有一个程序,我想在一个单独的线程中运行我的一个类,该线程的优先级高于程序的其余部分,我希望它在处理GUI时更新GUI,所以我使用std::thread GUI.h #include <thread> class GUI { private: Worker worker; std::thread workerThread; public: GUI (); ~GUI (); void runWorker (); } class Worker {

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

GUI.h

#include <thread>

class GUI
{
private:
   Worker worker;

   std::thread workerThread;

public:
   GUI ();
   ~GUI ();

   void runWorker ();
}
class Worker
{
public:
   void run ();
}
Worker.h

#include <thread>

class GUI
{
private:
   Worker worker;

   std::thread workerThread;

public:
   GUI ();
   ~GUI ();

   void runWorker ();
}
class Worker
{
public:
   void run ();
}
Worker.cpp

GUI::GUI ()
{
}

GUI::~GUI()
{
}

void GUI::runWorker()
{
   workerThread = std::thread (&Worker::run, worker);
}
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;
      }
   }
}
void Worker::run()
{
无符号整数=70;
for(无符号整数i=0;istd::terminate()

根据需要,调用
.join()
.detach()
以有序结束

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

std::terminate()
在销毁时,如果它管理线程。
根据需要,调用
.join()
.detach()
以有序结束


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

它会崩溃,因为您从未加入线程。
如果*它有一个关联的线程(joinable()==true),则调用std::terminate()。
它会崩溃,因为您从未加入线程。
如果*它有一个关联的线程(joinable()==true),std::terminate()被调用。
我的印象是,线程::join会一直阻塞,直到辅助进程完成。我不希望它阻塞,因为我希望GUI检查active,所以如果我进行分离,我的辅助进程将处于“非托管”状态所以线程不会终止?是的,你知道分离和连接之间的区别。我的印象是,thread::join会一直阻止,直到Worker完成。我不希望它阻止,因为我希望GUI检查activeSo,所以如果我分离,我的Worker将是“非托管的”所以线程不会终止?是的,你知道分离和连接的区别。