“取消pthread”和“退出pthread”这个词看起来令人困惑。 有人能帮我清楚地解释两者之间的区别吗?
P.S:请不要帮我链接到手册页,我已经看到了: - )
已添加:
1)如何处理线程数据结构和清理 这两种情况都有所不同吗?
2)当线程有待处理的信号时,待处理的信号如何 在这两种情况下处理信号掩码?
答案 0 :(得分:1)
参考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
:
<强> BUGS 强>
目前, wait(2)对具有死线程组负责人的已停止线程组的内核实现逻辑存在限制。如果停止信号被发送到其线程组负责人已经调用 pthread_exit(3)的前台进程,则可能会出现诸如锁定终端之类的问题。
所有引用来自Debian(非免费)包manpages-posix-dev (2.16-1)
。 (source package is here。)