术语“取消 pthread”和“退出 pthread”看起来令人困惑。有人可以帮我清楚地解释两者之间的区别吗?
PS:请不要帮助我提供指向手册页的链接,我已经看到了:-)
添加:
1)如何处理线程数据结构,以及这两种情况下的清理方式不同?
2)当线程有待处理的信号时,在这两种情况下如何处理待处理的信号掩码?
参考 OP 附录中的第一个问题,逐字逐句来自man pthread_cancel()
:
当执行取消请求时,线程将执行以下步骤(按此顺序):
取消清除处理程序被弹出(与它们被推送的顺序相反)并被调用。(参见pthread_cleanup_push(3)。)
以未指定的顺序调用特定于线程的数据析构函数。(参见pthread_key_create(3)。)
线程被终止。(参见pthread_exit(3)。)
上述步骤与pthread_cancel()调用异步发生;pthread_cancel()的返回状态只是通知调用者取消请求是否成功排队。
在取消的线程终止后,使用pthread_join(3)与该线程的连接将获得 PTHREAD_CANCELED 作为线程的退出状态。(加入线程是知道取消已完成的唯一方法。)
我看到的唯一区别是退出点:对于取消的线程,它是线程函数可能通过的任何取消点,否则它是pthread_exit()
,return
或线程函数的结尾。
更新(参考第二个问题):
我会说如果信号被放入线程的队列并且在取消完成后仍然处于挂起状态,则信号丢失。我不确定,但我可以想象只要线程存在,信号处理就会继续进行,这也是取消“期间”。
我能找到的所有关于此的信息来自man pthread_exit
:
错误
目前,在具有死线程组领导的已停止线程组上执行wait(2)的内核实现逻辑存在限制。如果将停止信号发送到线程组负责人已经调用pthread_exit(3)的前台进程,这可能会出现诸如锁定终端之类的问题。
所有报价均来自 Debian (non-free) package manpages-posix-dev (2.16-1)
。(源包在这里。)