Linux 取消和退出pthread之间有什么区别?

Linux 取消和退出pthread之间有什么区别?,linux,pthreads,Linux,Pthreads,术语“取消pthread”和“退出pthread”看起来很混乱。 有人能帮我解释清楚这两者的区别吗 请不要帮我链接到手册页,我已经看到了:-) 添加: 1) 如何处理线程数据结构和清理 这两种情况有什么不同 2) 当线程有挂起的信号时,挂起的信号如何 在这两种情况下都能处理信号吗 参考OP附录中的第一个问题,man pthread_cancel(): 对请求的取消执行操作时,线程将执行以下步骤(按此顺序): 取消清理处理程序弹出(与推送顺序相反)并调用。(请参见pthread\u cleanup

术语“取消pthread”和“退出pthread”看起来很混乱。 有人能帮我解释清楚这两者的区别吗

请不要帮我链接到手册页,我已经看到了:-)

添加:

1) 如何处理线程数据结构和清理 这两种情况有什么不同

2) 当线程有挂起的信号时,挂起的信号如何 在这两种情况下都能处理信号吗


参考OP附录中的第一个问题,
man pthread_cancel()

对请求的取消执行操作时,线程将执行以下步骤(按此顺序):

  • 取消清理处理程序弹出(与推送顺序相反)并调用。(请参见pthread\u cleanup\u push(3)

  • 以未指定的顺序调用特定于线程的数据析构函数。(请参见pthread\u key\u create(3)

  • 线程终止。(请参阅线程退出(3))

  • 上述步骤与pthread\u cancel()调用异步发生;pthread_cancel()的返回状态仅通知调用方取消请求是否已成功排队

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

    我看到的唯一区别是退出点:对于已取消的线程,它是线程函数可能通过的任何取消点,否则它是
    pthread_exit()
    return
    或线程函数的结尾


    更新(参考第二个问题):

    我会说,如果一个信号被放入线程的队列中,并且在取消完成后仍然处于挂起状态,那么该信号将丢失。我不确定,但我可以想象,只要线程存在,信号处理就一直在进行,也就是在取消过程中

    关于这一点,我只能从
    manpthread\u exit
    中找到:

    错误

    当前,wait(2)ing的内核实现逻辑中存在限制,即在停止的线程组中使用死线程组的前导。如果停止信号被发送到其线程组负责人已经调用了pthread\u exit(3)的前台进程,则这可能表现为诸如锁定终端之类的问题



    所有报价均来自Debian(非免费)软件包。(The.)

    取消线程是从线程外部启动的,它会非常小心地确保取消操作正确进行(并且线程可能持有的资源会被正确释放)。退出线程是线程在确定它应该退出时所做的事情,就像从函数返回一样。@MichaelBurr:在这两种情况下,线程数据结构是如何处理的,清理是如何不同的?当一个线程有挂起的信号时,在这两种情况下,挂起的信号掩码又是如何处理的?这些问题我没有专业知识来回答(因此我的评论相当高)。而且,你的问题并没有让人觉得你在寻找那个层次的细节;您可能希望将您在评论中提出的问题添加到顶层问题中。正如您所说,您已经阅读了手册页,我至少想知道您附录中的第一个问题,正如在
    man3pthread\u cancel
    @alk中所回答的:它只是说:
    任何已推送但尚未弹出的取消清理处理程序都会按推送然后执行的相反顺序弹出
    对于这两种情况来说都是一样的,这有点模糊,而且级别较高(我觉得)。请注意,我的问题是关于两者之间的差异,而不是手册页强调的相似性。对于pthread_exit和cleanup,也提到了完全相同的两点,这让人困惑吗?还是有什么区别?信号怎么样,还有什么提示吗?如果你能建议后面的sumthng会有很大帮助,我将不胜感激。@kingsmasher1:到底是什么让你困惑?另外,请看我的更新答案。这个手册页没有指定abt信号,你能发布你所指的那个吗?这对我们的参考有很大帮助。@kingsmasher1:我引用了当前Debian稳定版的手册页。