当您在取消时使用PThreads时,我对清理订单感到有点困惑。通常,如果您的线程已分离,它会在终止时自动清除。如果它没有分离,则需要加入它以回收系统资源。
我正在阅读的教科书中陈述以下内容,奇怪的是,加入对于取消而言是可选的:
“如果您需要知道线程何时实际终止,您必须 在取消后通过调用pthread_join加入它。“
那么,我是否需要加入已取消的线程以释放其资源 - 如果没有,那么为什么?
答案 0 :(得分:6)
TLPI说:
收到取消请求后,可取消的线程为 启用和延迟在下次取消时终止 点。如果线程没有分离,那么其中一些其他线程 进程必须与它一起加入,以便防止它成为一个 僵尸线程。
此外,由于通常不会立即取消线程(更多地了解“取消点数”)而没有加入,因此无法确定该线程是否已被实际取消。
答案 1 :(得分:3)
来自man pthread_join
:
取消的线程终止后,使用该线程加入 pthread_join(3)获取PTHREAD_CANCELED作为线程的退出状态。 (加入线程是了解取消的唯一方法 完成。)
如果您想知道实际上已经取得了什么成就,那么执行似乎不需要加入。
答案 2 :(得分:1)
来自pthread_cancel()
的 Doccumentation :
取消的线程终止后,使用pthread_join(3)与该线程的连接获得PTHREAD_CANCELED作为线程的退出状态。 (加入线程是了解取消已经完成的唯一方法。)
答案 3 :(得分:1)
使用pthread的线程可以具有以下取消状态:
PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_DISABLE
如果您尝试取消某个帖子,则不会100%知道该帖子是否真的会被取消。如果线程确实被取消,使用连接会将信息传递给您。还有一些取消类型和用于设置取消类型和状态的各个pthread函数:
int pthread_setcancelstate (int state, int *oldstate); int pthread_setcanceltype (int type, int *oldtype);借来的示例代码 编辑:要么发布几行代码我都太傻了,否则格式化程序今天真的让我很紧张。请查看上面链接中的代码。
答案 4 :(得分:0)
如果线程中出现问题或者以某种方式停止,它将始终由操作系统整理。所以这一切都很好而且安全。
如果你必须确定它实际上已经停止执行,你只需要加入线程,比如合并两个并行任务。 (例如,如果你有各种各样的线程处理各个部分,你需要将它们全部连接起来,就像等待它们全部完成一样,当你想再次组合结构时)