【发布时间】:2011-05-19 10:33:37
【问题描述】:
我正在编写一个多线程程序,我有一个问题: 假设,在主线程中执行时,我想终止所有 子线程。我不能只向他们发送终止信号,因为我想要他们 首先释放动态分配的内存。我可以定义一个特定的信号处理程序吗 执行的每个线程函数中的函数,该函数又将调用 我将为此编写一个清理函数?如果不是,我怎样才能实现我的目标??
谢谢, 尼科斯
【问题讨论】:
我正在编写一个多线程程序,我有一个问题: 假设,在主线程中执行时,我想终止所有 子线程。我不能只向他们发送终止信号,因为我想要他们 首先释放动态分配的内存。我可以定义一个特定的信号处理程序吗 执行的每个线程函数中的函数,该函数又将调用 我将为此编写一个清理函数?如果不是,我怎样才能实现我的目标??
谢谢, 尼科斯
【问题讨论】:
查看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).)
所以你可以在你的 main 中使用pthread_cancel,前提是你已经使用上述函数正确注册了你的清理处理程序。
(请完整阅读该手册页,其中包含很多重要信息。)
编辑:(来自 cmets)如果您打算使用 PTHREAD_CANCEL_DEFERRED 并需要在代码中的某处插入取消点,请使用 pthread_testcancel。此函数检查是否请求取消。如果是这种情况,则取消服务(即该调用永远不会返回)。否则无效。
【讨论】:
pthread_testcancel,这正是它的用途。 sleep 可以用信号实现,而sleep(0) 不保证不休眠——唯一的保证是它会休眠至少 0 秒。
最强大的策略需要子线程的合作:您设置一个线程定期检查的标志,并在设置标志时释放它们正在使用的任何资源,然后终止。
【讨论】:
periodically check a variable 当然是use a pthread condition variable 的简写——<whistle/>
取消(Mat 的回答)是正确且规范的,但如果您想要一种不同的方法,您可以使用不带 SA_RESTART 标志的 sigaction 安装无操作信号处理程序,并将 pthread_kill 与任何信号一起使用您选择的号码以中断 (EINTR) 无论线程可能已被阻止。结合这一点,aix 的回答很有效。
【讨论】: