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

时间:2013-06-05 09:08:12

标签: linux pthreads

“取消pthread”和“退出pthread”这个词看起来令人困惑。 有人能帮我清楚地解释两者之间的区别吗?

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

已添加:

  

1)如何处理线程数据结构和清理   这两种情况都有所不同吗?

     

2)当线程有待处理的信号时,待处理的信号如何   在这两种情况下处理信号掩码?

1 个答案:

答案 0 :(得分:1)

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

  

当请求取消被执行时,线程会发生以下步骤(按此顺序):

     
      
  1. 弹出取消清理处理程序(与它们被按下的顺序相反)并调用。 (见 pthread_cleanup_push(3)。)

  2.   
  3. 以未指定的顺序调用特定于线程的数据析构函数。 (参见 pthread_key_create(3)。)

  4.   
  5. 线程终止。 (参见 pthread_exit(3)。)

  6.         

    上述步骤与 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。)