我正在编写一个多线程程序,我有这个问题: 假设,在主线程中执行时,我想终止所有 子线程。我不能只是发送一个终止信号,因为我想要它们 首先释放动态分配的内存。我可以定义特定的信号处理程序 函数在每个执行的线程函数中,而这个函数又将调用 一个清理功能,我会写这样做?如果不是我怎么能实现我的目标?
谢谢, 尼科斯
答案 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
)线程可能被阻止的任何内容。结合这一点,艾克斯的答案有效。