调用join时可能导致可连接线程失败的原因

时间:2016-08-29 14:30:20

标签: c++ multithreading join system-error

当我调用joinThread时,我偶尔会得到一个带有"无效参数"的std :: system_error throw。在加入电话。当我用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;
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

  • 您的线程是默认构造的吗?您是否使用有效的回调函数对其进行了初始化?
  • 线程是否分离?
  • 您是否move找到了线程?
  • 线程是否正在尝试访问已保留的资源?考虑可能的死锁源!也许您被卡在某个地方。 (但是afaik线程仍然应该可以连接。)
  • friend方法或类是否尝试访问/使用/加入线程?

我最近忘记了将函数传递给线程,该线程是我默认构造的,以便以后使用。这是由于有条件的初始化过程而发生的。因此,关于上面的示例类: 默认情况下,您的workThread是在构造exampleClass的对象时构造的。如果调用doWork(),则仅传递回调函数。您已确保仅在线程处于可联接状态时才联接该线程。一旦销毁您的物品,也可以保证。因此,我能想到的最可能的原因(为什么会失败)是如果您有friend。虽然您没有在示例中添加它,但是也许您忽略了这一点,因为您想提供一种简化的形式。

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