std::thread::join()
失败,如果帖子是"无效"则为std::system_error
投放no_such_process
。请注意,no_such_process
大小写不同于不可连接的线程(错误代码为invalid_argument
)。
在什么情况下会发生这种情况?或者,我必须做些什么来确保join()
因此而失败?我想要一个析构函数join()
它管理的一些线程,当然我希望析构函数永远不会抛出异常。什么可以使(正确构造和未被破坏)线程无效"。
答案 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()
。
ESRCH
。pthread_join
可能会给ESRCH
。 C ++线程的ID是私有数据,因此找不到ID的唯一方法是this
未指向正确构造的std::thread
。我得出结论,这种错误情况只能在早期具有未定义行为的操作中发生,例如错误的reinterpret_cast
或使用悬空指针。