你需要加入取消的线程吗?(pthreads)

Do you need to join a cancelled thread? (pthreads)

本文关键字:pthreads 线程 取消      更新时间:2023-10-16

当您在取消方面使用PThreads时,我对清理顺序有点困惑。通常,如果线程被分离,它会在终止时自动清理。如果它没有分离,则需要加入它以回收系统资源。

我正在阅读的教科书中指出,以下内容听起来很奇怪,加入对于取消来说是可选的:

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

那么,我需要加入一个被取消的线程来释放它的资源吗?如果不需要,为什么?

TLPI这样说:

在接收到取消请求时,可取消性为enabled和deferred在下一次到达取消时终止指向如果线程没有分离,则进程必须与其连接,以防止它成为僵尸线程。

此外,由于取消线程通常不会在没有加入的情况下立即完成(阅读更多关于"取消点"的信息),您无法确定该线程是否真的被取消了。

来自man pthread_join:

在被取消的线程终止后,使用pthread_join(3)获得PTHRAD_CANCELED作为线程的退出状态。(使用线程连接是知道取消具有已完成。)

似乎加入对于执行来说是不必要的——如果你想知道你实际成功了什么,那么加入是必要的。

来自pthread_cancel():的文档

在被取消的线程终止后,使用pthread_join(3)与该线程的联接将获得pthread_CCANCELED作为线程的退出状态。(使用线程连接是知道取消已完成的唯一方法。)

使用pthread的线程可以具有以下取消状态:

PTHREAD_CANCEL_ENABLEPTHREAD_CANCEL_DISABLE

如果你试图取消一个线程,你不会100%知道这个线程是否真的会被取消。如果线程真的被取消或没有被取消,使用联接会向您传递信息。还有需要考虑的取消类型以及用于设置取消类型和状态的相应pthread功能:

int pthread_setcancelstate(int state,int*oldstate);int pthread_setcanceltype(int类型,int*oldtype);

以下是从中借来的示例代码http://www.ijon.de/comp/tutorials/threads/cancel.html

编辑:要么我太笨了,没法发布几行代码,要么格式化程序今天真的让我很紧张。请在上面的链接中查找代码。

如果某个线程出现问题,或者以某种方式被in阻止,操作系统总是会对其进行清理。所以一切都很好,很安全。

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