线程中的信号处理程序

时间:2011-05-19 10:33:37

标签: c linux pthreads signals

我正在编写一个多线程程序,我有这个问题: 假设,在主线程中执行时,我想终止所有 子线程。我不能只是发送一个终止信号,因为我想要它们 首先释放动态分配的内存。我可以定义特定的信号处理程序 函数在每个执行的线程函数中,而这个函数又将调用 一个清理功能,我会写这样做?如果不是我怎么能实现我的目标?

谢谢, 尼科斯

3 个答案:

答案 0 :(得分:4)

查看pthread_cancel的手册页:

  

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

   1. Cancellation clean-up handlers are popped (in the reverse of the order in
      which they were pushed) and called.  (See pthread_cleanup_push(3).)

   2. Thread-specific data destructors are called, in an unspecified order.  (See
      pthread_key_create(3).)

   3. The thread is terminated.  (See pthread_exit(3).)

因此,如果您使用上述功能正确注册了清理处理程序,则可以使用主文件中的pthread_cancel

(尽管完全阅读了手册页,它有很多重要的信息。)

修改 :(来自评论)如果您打算使用PTHREAD_CANCEL_DEFERRED并需要在代码中的某处插入取消点,请使用pthread_testcancel。此功能检查是否请求取消。如果是这种情况,则取消服务(即该呼叫永远不会返回)。否则它没有效果。

答案 1 :(得分:1)

最强大的策略需要来自子线程的协作:您设置一个线程定期检查的标志,并在设置标志时释放它们正在使用的任何资源然后终止。

答案 2 :(得分:0)

取消(Mat的答案)是正确的和规范的,但是如果你想要一种不同的方法,你可以使用sigaction安装一个无操作信号处理程序,而不使用SA_RESTART标志,并使用{{ 1}}使用您选择的任何信号编号来中断(pthread_kill)线程可能被阻止的任何内容。结合这一点,艾克斯的答案有效。