你需要加入取消的帖子吗? (并行线程)

时间:2012-01-23 16:53:43

标签: c++ multithreading pthreads

当您在取消时使用PThreads时,我对清理订单感到有点困惑。通常,如果您的线程已分离,它会在终止时自动清除。如果它没有分离,则需要加入它以回收系统资源。

我正在阅读的教科书中陈述以下内容,奇怪的是,加入对于取消而言是可选的:

  

“如果您需要知道线程何时实际终止,您必须   在取消后通过调用pthread_join加入它。“

那么,我是否需要加入已取消的线程以释放其资源 - 如果没有,那么为什么?

5 个答案:

答案 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);

以下是从http://www.ijon.de/comp/tutorials/threads/cancel.html

借来的示例代码 编辑:要么发布几行代码我都太傻了,否则格式化程序今天真的让我很紧张。请查看上面链接中的代码。

答案 4 :(得分:0)

如果线程中出现问题或者以某种方式停止,它将始终由操作系统整理。所以这一切都很好而且安全。

如果你必须确定它实际上已经停止执行,你只需要加入线程,比如合并两个并行任务。 (例如,如果你有各种各样的线程处理各个部分,你需要将它们全部连接起来,就像等待它们全部完成一样,当你想再次组合结构时)