什么时候标准::线程::连接会因no_such_process而失败

When can std::thread::join fail due to no_such_process

本文关键字:such process 失败 no 标准 线程 连接 什么时候      更新时间:2023-10-16
允许

std::thread::join()失败,如果线程"无效",则抛出std::system_error no_such_process。请注意,no_such_process情况不同于不可联接的线程(错误代码为 invalid_argument (。

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

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

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

或者,我必须怎么做才能确保 join(( 不会因此而失败?

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


1( 失败,我的意思是报告true而不是false或相反,而不是抛出或崩溃。

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或使用悬空指针。