2011-05-19 167 views
1

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

感谢, 尼科斯

回答

4

看看man页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。该功能检查是否要求取消。如果是这种情况,则取消服务(即该呼叫永不返回)。否则它不起作用。

+0

这是一个很好的解决方案。我自己使用它,设计出来整齐。 – Jay 2011-05-19 11:59:12

+0

感谢您的回答!我正在考虑使用pthread_cleanup_push和相应的退出处理函数来释放所有内容。如果我设置PTHREAD_CANCEL_DEFERRED是否有效,有一个睡眠(0)作为取消点,所以我不会有任何开销? – nikos 2011-05-19 12:52:58

+1

@nikos:这不是最好的方法。使用['pthread_testcancel'](http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_testcancel.3.html),这正是它的目的。睡眠可以通过信号来实现,并且睡眠不保证不睡眠 - 唯一的保证是睡眠时间至少为0秒。 – Mat 2011-05-19 12:59:29

1

最稳健的策略需要从子线程合作:你设置一个标志,该线程定期检查,当设置了标志,他们正在使用免费的一切资源,然后终止。

+0

'定期检查一个变量'当然是'使用一个pthread条件变量'的速记' - **''** – sehe 2011-05-19 11:24:40

+0

这是不可能的,如果线程可能被阻塞长期或永久阻塞/睡觉系统调用。这就是为什么取消存在。 – 2011-05-19 11:28:25

0

取消(马太福的答案)是正确的,规范的,但如果你想有一个不同的方法,你可以安装使用sigaction无操作信号处理程序没有SA_RESTART标志和使用pthread_kill你才能选择任何信号数中断(EINTR)无论线程可能被阻塞。与此相结合,艾克斯的答案起作用。