什么时候标准::线程::连接会因no_such_process而失败
When can std::thread::join fail due to no_such_process
允许
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
或使用悬空指针。
相关文章:
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 以某种方式告诉编译器"Do not process line of code"
- 尝试通过Process Pipe发送/接收到python包装器,c ++代码
- "No such file or directory" C++标头问题
- Boost::process on Windows - with MinGW?
- 我在 #include < bits/stdc++h.> 放置时出错"No such file or directory"
- 如何将IEnumerable与Process.Start的输出事件处理程序一起使用?
- 叮叮当当。target_include_directories "No such file or directory"
- 从生成文件编译错误:"Unable to open output file" ..."No such file or directory"
- C++编译期间出现"No such file or directory"错误
- 使用单独的参数调用"boost::process::system()"时,获取"execv
- Boost.Process - 从具有休眠循环的进程读取
- 尝试编译 TensorFlow 时出错"/system/bin/linker: No such file or directory"
- 代码块中的哈希库++库"No such file or directory"错误
- AWS Lambda C++ 开发工具包"Process exited before completing request"
- 保持 boost.process 在函数之外处于活动状态,该函数被调用
- 成功使用CMakeLists制作后如何修复"open: No such file or directory"错误(该文件实际上存在)
- QMetaObject::invokeMethod: no such method QTextCursor::MoveO