0

当我调用 joinThread 时,偶尔会std::system_error在 join 调用中抛出“无效参数”。该错误似乎只在我使用 gcc 编译时出现,并且它并非始终可重现,即它偶尔会发生并且不可预测。有谁知道什么可能导致这样的错误?

下面是我的代码的简化版本。

class exampleClass
{
   public:
   exampleClass()
   {
   }
   
   ~exampleClass()
   {
      joinThread();
   }

   void doWork()
   {
       joinThread();
       workThread = std::thread(&exampleClass::threadFunction, this);
   }

   void joinThread()
   {
      if(workThread.joinable()) workThread.join();
   }

   protected:
   void threadFunction()
   {
      std::cout << "Do something that requires time..." << std::endl
   }

   std::thread       workThread;
}

任何帮助将不胜感激。

4

1 回答 1

2

由于您没有提供发生此错误的示例,因此我只能根据自己的经验发言。为了避免这样的错误,您应该考虑一些事情:

  • 你的线程只是默认构造的,resp。您是否使用有效的回调函数对其进行了初始化?
  • 你的线程是分离的吗?
  • 你有你move的线程吗?
  • 线程是否试图访问已保留的资源?想想可能的死锁来源!也许你被困在某个地方。(但是无论如何,线程应该仍然可以连接。)
  • 方法或类是否friend尝试访问/使用/加入线程?

我最近忘记将一个函数传递给一个线程,我已经默认构造了它以便以后使用它。这是由于条件初始化过程而发生的。所以关于你上面的示例类:你workThread是在构造一个对象时默认构造的exampleClass。回调函数仅在您调用时才被传递doWork()。您已确保线程仅在处于可连接状态时才被连接。在销毁您的对象时,这也得到了保证。因此,我能想到的最可能的原因是,如果你有一个friend. 尽管您没有将其放在示例中,但也许您忽略了这一点,因为您想呈现一个简化的形式。

也许也可以在这里看看:http: //cppatomic.blogspot.com/2018/05/modern-effective-c-make-stdthread.html可能会有所帮助。

于 2020-02-28T13:03:44.397 回答