什么时候std :: thread :: join由于no_such_process

时间:2018-04-20 15:22:50

标签: c++ multithreading

允许

std::thread::join()失败,如果帖子是"无效"则为std::system_error投放no_such_process。请注意,no_such_process大小写不同于不可连接的线程(错误代码为invalid_argument)。

在什么情况下会发生这种情况?或者,我必须做些什么来确保join()因此而失败?我想要一个析构函数join()它管理的一些线程,当然我希望析构函数永远不会抛出异常。什么可以使(正确构造和未被破坏)线程无效"。

2 个答案:

答案 0 :(得分:3)

  

在什么情况下会发生这种情况?

在* nix系统上,当您尝试加入其ID不在线程表中的线程时,会发生这种情况,这意味着线程不再存在(不再)。当线程已经加入和终止,或者线程变量的内存已经损坏时,可能会发生这种情况。

  

或者,我必须做些什么来确保join()不会因为这个原因而失败?

您可以测试std::thread::joinable(),但也可能会失败 1 。只是不要弄乱你的线程变量,你就好了。简单地忽略这种可能性,如果你遇到这样的错误你的程序更好的核心转储并让你分析错误。

<子> 1) 失败,我的意思是报告true而不是false或反过来,而不是抛出或崩溃。

答案 1 :(得分:1)

no_such_process错误代码对应于ESRCH POSIX错误代码。在POSIX系统上std::thread::join()可能会委托给pthread_join()

  • POSIX的第7期删除了ESRCH
  • 的可能性
  • 在Linux上,如果找不到具有给定线程ID的线程,pthread_join可能会给ESRCH。 C ++线程的ID是私有数据,因此找不到ID的唯一方法是this未指向正确构造的std::thread

我得出结论,这种错误情况只能在早期具有未定义行为的操作中发生,例如错误的reinterpret_cast或使用悬空指针。