c++ - 什么会导致可连接线程在调用 join 时失败

标签 c++ multithreading std-system-error

当我调用 joinThread 时,我偶尔会在 join 调用中抛出一个带有“无效参数”的 std::system_error 。该错误似乎仅在我使用 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;
}

任何帮助将不胜感激。

最佳答案

由于你没有提供示例,所以我只能从我自己的经验中讲出这个错误是在哪里发生的。为了避免此类错误,您应该考虑一些事项:

  • 您的线程是否只是默认构造的?您是否使用有效的回调函数初始化了它?
  • 您的线程是否已分离?
  • 移动您的帖子了吗?
  • 线程是否正在尝试访问已保留的资源?考虑一下可能的死锁来源!也许你被困在某个地方了。 (但据我所知,线程无论如何仍然应该是可连接的。)
  • friend 方法或类是否尝试访问/使用/加入线程?

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

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

关于c++ - 什么会导致可连接线程在调用 join 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39208737/

相关文章:

c++ - SCHANNEL TLS 服务器端无法 CertFindCertificateInStore

c++ - 如何将位图字体从 C header 格式转换为原始位

c++ - 用 fork() 模拟线程

c - 如何向其他线程发送包含更多信息的信号?

C++11(或 Boost)system_error 策略

c++ - std::exception 是否拥有 `what()` ?

c++ - 使用 boost::asio::socket_base 发送数据

c++ - 如何正确设置 fwrite() 的大小和计数参数以写入一大块字节?

java - 在连续语句中启动的两个线程是同时运行,还是相继运行?

c++ - 了解 C++11 中的 <system_error> 工具